Cmake Learn

news/2024/5/19 6:28:47

目录

1 常用命令

(1)configure_file

(2).cmake文件

(3) install

(4)include_directories

(5) add_subdirectory

(6) find_library

2 cmake 生成库文件

(1)目录结构

(2) 代码

3 cmake调用库文件

(1)目录结构

(2)代码


1 常用命令
(1)configure_file

在 CMake 中,configure_file 命令用于复制一个源文件到一个目标位置,并在复制的过程中替换源文件中的某些变量。这对于生成配置头文件特别有用,其中某些值(如路径、版本号等)需要在构建时确定。

(2).cmake文件
file(GLOB FREECAD_HELPER_CMAKE_FILES ./*.cmake)
set(_SKIP_FILES "SetupQt.cmake")
foreach(_CMAKE_FILE ${FREECAD_HELPER_CMAKE_FILES})get_filename_component(_FILENAME ${_CMAKE_FILE} NAME)if (NOT _FILENAME IN_LIST _SKIP_FILES)include(${_CMAKE_FILE})endif()
endforeach(_CMAKE_FILE ${FREECAD_HELPER_CMAKE_FILES})
(3) install

在 CMake 中,install() 命令用于指定构建目标在安装时应该被复制到哪里。这通常用于安装库、头文件、可执行文件等,以便其他项目或用户可以使用它们。

# CMakeLists.txt  
add_executable(my_program main.cpp)  # 安装可执行文件到 /usr/local/bin 目录  
install(TARGETS my_program DESTINATION bin)# CMakeLists.txt  
add_library(my_library my_library.cpp)  # 安装库文件到 /usr/local/lib 目录  
install(TARGETS my_library DESTINATION lib)# CMakeLists.txt  
include_directories(include)  # 安装头文件到 /usr/local/include/my_project 目录  
install(FILES include/my_header.h DESTINATION include/my_project)# CMakeLists.txt  
# 安装多个文件到不同目录  
install(FILES file1.txt file2.txt DESTINATION share/my_project)  # 安装整个目录及其内容  
install(DIRECTORY doc/ DESTINATION share/my_project/docs)
(4)include_directories

在 CMake 中,include_directories() 命令用于向编译器添加包含目录,使得在编译源文件时可以找到所需的头文件。这通常用于指定项目中的头文件目录,或者是第三方库的头文件目录。

# 添加多个头文件目录  
include_directories(  include  third_party/library1/include  third_party/library2/include  
)  
(5) add_subdirectory

 add_subdirectory 是 CMake 中的一个命令,用于将子目录添加到构建过程中。这个命令的作用是在当前 CMakeLists.txt 文件的对应位置包含子目录中的 CMakeLists.txt 文件,并执行其中的命令。这使得项目的组织和管理变得更为容易和高效。

cmake_minimum_required(VERSION 3.10)  
project(MyProject)  # 添加子目录 src 到构建中  
add_subdirectory(src)  # 在父目录的 CMakeLists.txt 中,你还可以链接子目录中定义的目标  
target_link_libraries(MyApp MyLib) # 假设 MyLib 是在 src 目录中定义的目标
(6) find_library
find_library(CMAKE_LIB cmake_library HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
# 打印PROJECT_SOURCE_DIR变量的值
message(STATUS "PROJECT_SOURCE_DIR is: ${PROJECT_SOURCE_DIR}")
# 如果CMAKE_LIB变量被成功设置(即库被找到),你也可以打印它的值
if(CMAKE_LIB)message(STATUS "Found library: ${CMAKE_LIB}")
else()message(FATAL_ERROR "Library not found!")
endif()

find_library(<VARNAME> name [path1 path2 ...]  
              [NO_DEFAULT_PATH] [NO_CMAKE_ENVIRONMENT_PATH]  
              [NO_CMAKE_PATH] [NO_SYSTEM_ENVIRONMENT_PATH]  
              [NO_CMAKE_SYSTEM_PATH] [CMAKE_FIND_ROOT_PATH_BOTH |  
              ONLY_CMAKE_FIND_ROOT_PATH | NO_CMAKE_FIND_ROOT_PATH])
 

  • <VARNAME>:一个变量名,用于存储找到的库的完整路径。
  • name:要查找的库的名字,不带前缀(比如 lib)和后缀(比如 .so.a.dylib.lib 等)。
  • path1 path2 ...:可选参数,指定额外的路径来搜索库文件。
target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB})

在 CMake 中,target_link_libraries 命令用于指定一个目标(例如库或可执行文件)需要链接的库。这个命令将库添加到目标的链接器命令中,以便在构建目标时能够解析目标中的外部符号。

在你提供的命令 target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB}) 中:

  • cmake_test 是你想要链接库的目标名。
  • PRIVATE 是一个关键字,它指定了链接库的可见性范围。PRIVATE 表示这个库只会被 cmake_test 目标使用,并且不会传递给依赖于 cmake_test 的其他目标。CMake 提供了几种可见性范围,包括 PUBLICPRIVATE 和 INTERFACE,它们决定了库是如何被传播到依赖目标的。
  • Qt5::Widgets 是一个由 find_package(Qt5 COMPONENTS Widgets) 提供的导入目标,它代表 Qt5 Widgets 模块。使用导入目标而不是直接指定库文件路径是 CMake 推荐的做法,因为它可以自动处理库的依赖关系和其他平台相关的细节。
  • ${CMAKE_LIB} 是一个变量,它应该在 CMakeLists.txt 文件的某个地方被定义。这个变量可能包含了一个或多个需要链接的库名或库文件路径。使用 ${...} 语法是 CMake 中获取变量值的方式。

这个命令的意思是:为 cmake_test 目标链接 Qt5 的 Widgets 模块,并链接由 ${CMAKE_LIB} 变量指定的库。

确保你已经通过 find_package 或其他方式找到了 Qt5 Widgets 模块,并且已经定义了 CMAKE_LIB 变量。如果 CMAKE_LIB 变量没有被正确设置,这个命令将不会按预期工作。通常,CMAKE_LIB 变量可能是在 CMakeLists.txt 文件的某个地方通过 find_library 或其他方式设置的。

2 cmake 生成库文件
(1)目录结构

(2) 代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)project(cmake_library LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt5 COMPONENTS Core REQUIRED)add_library(cmake_library SHAREDcmake_library_global.hcmake_library.cppcmake_library.h
)target_link_libraries(cmake_library PRIVATE Qt5::Core)target_compile_definitions(cmake_library PRIVATE CMAKE_LIBRARY_LIBRARY)

cmake_library_global.h

#ifndef CMAKE_LIBRARY_GLOBAL_H
#define CMAKE_LIBRARY_GLOBAL_H#include <QtCore/qglobal.h>#if defined(CMAKE_LIBRARY_LIBRARY)
#  define CMAKE_LIBRARY_EXPORT Q_DECL_EXPORT
#else
#  define CMAKE_LIBRARY_EXPORT Q_DECL_IMPORT
#endif#endif // CMAKE_LIBRARY_GLOBAL_H

cmake_library.h

#ifndef CMAKE_LIBRARY_H
#define CMAKE_LIBRARY_H#include "cmake_library_global.h"class CMAKE_LIBRARY_EXPORT Cmake_library
{
public:Cmake_library();int add(int a,int b);
};#endif // CMAKE_LIBRARY_H

cmake_library.cpp

#include "cmake_library.h"Cmake_library::Cmake_library()
{
}int Cmake_library::add(int a, int b)
{return a + b;
}
3 cmake调用库文件
(1)目录结构

(2)代码

 外层CMakeLists.txt

project(cmake_test LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)add_subdirectory(src bin)

src/CMakeLists.txt

cmake_minimum_required(VERSION 3.5)find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_library(CMAKE_LIB cmake_library HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
# 打印PROJECT_SOURCE_DIR变量的值
message(STATUS "PROJECT_SOURCE_DIR is: ${PROJECT_SOURCE_DIR}")
# 如果CMAKE_LIB变量被成功设置(即库被找到),你也可以打印它的值
if(CMAKE_LIB)message(STATUS "Found library: ${CMAKE_LIB}")
else()message(FATAL_ERROR "Library not found!")
endif()include_directories (../inc/)
set(SRC_LISTmain.cppmainwindow.cpp../inc/mainwindow.h)add_executable(cmake_test${SRC_LIST}
)target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB})


http://www.mrgr.cn/p/76256711

相关文章

笔记-用Python脚本启停JAR程序

用Python脚本启停JAR程序&#xff0c;需要用到python中的以下内置模块 subprocess 是 Python 的一个标准库模块&#xff0c;用于在新进程中执行子命令&#xff0c;获取子进程的输入/输出/错误以及返回码等os 是 Python 的一个标准库模块&#xff0c;它提供了与操作系统交互的功…

社区版pycharm下载安装教程

参考:韩顺平——下载 在浏览器输入 www.jetbrains.com/进入pycharm官网 指向Developer Tools,点击Pycharm 点击Download 为了更好得跟踪韩老师的教程,我这里选择下载与韩老师一致的版本(对版本无要求的话直接点击download)找到2023.2.2的版本,在PyCharm Community Editio…

嵌入式笔记4.2 USART

目录一、USART 简介二、USART 寄存器详解寄存器基础信息寄存器地址寄存器名称与作用USART 寄存器组简表寄存器详解1. 控制寄存器 1(USART_CR1)2. 控制寄存器 2(USART_CR2)3. 控制寄存器 3(USART_CR3)4. 波特率寄存器(USART_BRR)5. 保护时间和预分频器寄存器(USART_GTP…

嵌入式笔记4.3 异常和中断详解

目录一、异常和中断的简介1. 外设中断处理流程2. 中断处理与异常处理3. 支持的异常和中断数量二、异常类型三、中断管理简介四、优先级定义五、向量表和向量表重定位六、中断输入和挂起行为七、异常流程简介1. 接受异常请求2. 异常进人流程3. 执行异常处理4. 异常返回八、中断控…

学习3:scrapy请求对象、模拟登录、POST请求、管道的使用、crawlspider爬虫类

请求对象 请求对象参数 scrapy.Request(url[],callback,method"GET",headers,body,cookies,meta,dont_filterFalse)callback 表示当前的url响应交给那个函数去处理method 指定请求方式headers 接受一个字典&#xff0c;其中不包括cookiesbody 接收json字符串&#…

数字旅游以科技创新为核心:推动旅游服务的智能化、精准化、个性化,为游客提供更加贴心、专业、高效的旅游服务

目录 一、引言 二、数字旅游以科技创新推动旅游服务智能化 1、智能化技术的应用 2、提升旅游服务的效率和质量 三、数字旅游以科技创新推动旅游服务精准化 1、精准化需求的识别与满足 2、精准化营销与推广 四、数字旅游以科技创新推动旅游服务个性化 1、个性化服务的创…

HTUCTF2024 河南师范大学招新赛

CRYPTO easyMath 题目 中国古代有很多人同名譬如同样叫孙子,有的人会兵法,有的人会数学你能帮我求解出这道题的答案吗?请开启容器后下载对应输出文件难度:简单 from secret import flag from Crypto.Util.number import *def s2n(string):return int(string.encode("u…

2024 年 5 月 1 日 周三 小雨 冷(384 字)

正文祖父见到我和见长,第一句话是好久都没看到我们的孙子了。然后第二句话直接把我们俩都干懵了。“你们有没有阿托品啊?”我第一反应是懵,第二反应是想笑。上哪儿给你找这种处方药去…… 这种 M 受体阻断剂管得还严,严重有机磷中毒的时候,一掰就是几十支。而且这药不是最…

安装库后JupyterLab一直报ModuleNotFoundError问题解决

背景&#xff1a; 先安装的Python3.10&#xff0c;安装在默认路径&#xff1a; C:\Users\#用户名省略#\AppData\Local\Programs\Python\Python310\ 后安装的Anaconda&#xff0c;更改过路径在D盘&#xff1a; D:\ProgramData\anaconda3 此时C盘Python安装路径下Scripts文件…

linux搭建个人博客wordpress(LNMP)

目录 准备阶段&#xff1a; 1.部署LNMP环境 2.配置数据库 3.上线WordPress博客平台 4.来到web界面安装博客平台 5.WordPress博客平台优化 总结&#xff1a; 利用LNMPWordPress搭建博客网站平台 WordPress是一款使用PHP语言开发的博客平台 1.易用性高&#xff1a;操作简单…

linuxI2C驱动核心梳理

参考文章《linux设备驱动开发详解》第15章 【linux iic子系统】i2c整体框图【精髓部分】(五)_bus_for_each_drv-CSDN博客 linux设备驱动程序——i2c总线的添加与实现_如何填充i2c_client-CSDN博客 【linux iic子系统】i2c设备与驱动匹配过程(三)_i2c_add_driver 如何和clen…

Python异步Redis客户端与通用缓存装饰器

前言 这里我将通过 redis-py 简易封装一个异步的Redis客户端&#xff0c;然后主要讲解设计一个支持各种缓存代理&#xff08;本地内存、Redis等&#xff09;的缓存装饰器&#xff0c;用于在减少一些不必要的计算、存储层的查询、网络IO等。 具体代码都封装在 HuiDBK/py-tools: …

Java web第五次作业

1.在idea中配置好数据源 2、视频案例中只给出了查询所有结果的示例&#xff0c;请自己完成添加、删除、修改操作的代码。以下供参 考。 Delete("delete from emp where id#{id}") public void delete(Integer id); 测试代码 Test public void testDelete(){ empMa…

mac安装虚拟机linux系统

需要下载的有&#xff1a;centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有&#xff1a; CentOS、ubuntu、redhat&#xff0c;选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

【初中英语提分神器】中考高频词汇大全001-A开头单词高频,轻松掌握,考试无忧!速来围观!

PDF格式公众号回复关键字:ZKGCH001副词 1 already 已经 She has already finished her homework. (她已经完成了她的作业。) 2 also 也,同样地,而且 They went to the movies, and I also went. (他们去看了电影,我也去了。) 3 almost 几乎,差不多 Ive almost finished…

循环神经网络模块介绍(Pytorch 12)

到目前为止&#xff0c;我们遇到过两种类型的数据&#xff1a;表格数据和图像数据。对于图像数据&#xff0c;我们设计了专门的卷积神经网络架构(cnn)来为这类特殊的数据结构建模。换句话说&#xff0c;如果我们拥有一张图像&#xff0c;我们 需要有效地利用其像素位置&#xf…

双向链表的简单实现

目录 1. 双向链表的结构 2.双向链表的实现 2.1 初始化 2.2 增 2.2.1 尾插 ​编辑 2.2.2 头插 3.删 2.3.1 尾删 2.3.2 头删 4. 找 5.任意位置插入 5.1 任意位置前插入 ​编辑 5.2 任意位置后插入 ​编辑 6. 任意位置删除 ​编辑 7. 改 8. 链表的销毁 3. 顺序…

Python编程——ModuleNotFoundError: No module named learning logs

Python编程:从入门到实践(2)第18章-从Django入手 执行命令 python manage.py makemigrations learning_logs 时报错,如图: 问题原因:learning_logs 错写成 learning logs正确代码如下:INSTALLED_APPS = [# 我的应用程序learning_logs,# 默认添加的应用程序django.contr…

Python第三方库的安装和导入

Python第三方库的安装和导入是Python编程中常见的操作,下面我将为您详细解释这两种操作,并提供相关案例。 Python中最常用的包管理工具是pip,可以方便地安装和管理第三方库。以下是几种常用的安装方法。目录一、Python第三方库的安装1. 使用pip命令行安装2. 使用PyCharm进行…

Python的国内安装源(也称为镜像源)

Python的国内安装源(也称为镜像源)数量会随着时间而增加或减少,因为新的镜像源可能会建立,而一些旧的镜像源可能会停止服务或不再更新。以下是一些常用的Python国内安装源(也称为PyPI镜像源)Python的国内安装源(也称为镜像源)数量会随着时间而增加或减少,因为新的镜像…