当前位置: 首页 > article >正文

CMakeLists.txt的学习了解

CMakeLists.txt 是 CMake 构建系统中的配置文件,用于定义项目的编译规则和依赖关系。CMake 是一种跨平台的构建系统,支持从源代码生成编译脚本(如 Makefile 或 Visual Studio 工程文件)。CMakeLists.txt 通过指定项目信息、源文件、编译选项、库等,指导 CMake 如何构建项目。

下面介绍 CMakeLists.txt 的编写规则与方法:

1. 基本结构

CMakeLists.txt 通常包含以下几个部分:

  1. 指定 CMake 最低版本
  2. 定义项目名称和语言
  3. 添加源文件
  4. 指定目标(可执行文件或库)
  5. 配置库与依赖
  6. 设置编译选项
  7. 安装和测试

2. 常用命令

2.1. cmake_minimum_required

作用: 设置项目要求的 CMake 最低版本。

cmake_minimum_required(VERSION 3.10) 

这个命令指定了项目必须使用 CMake 3.10 或更高的版本。

2.2. project

作用: 定义项目的名称和使用的语言。

project(MyProject LANGUAGES C CXX) 

project 命令设置项目名称为 MyProject,并指定使用的语言为 CC++

2.3. add_executable / add_library

作用: 添加一个可执行文件或库。

  • add_executable 用于定义可执行文件。
  • add_library 用于定义静态或动态库。
add_executable(MyApp main.cpp) # 创建可执行文件 MyApp,源文件为 main.cpp add_library(MyLib STATIC mylib.cpp) # 创建静态库 MyLib,源文件为 mylib.cpp 
2.4. target_link_libraries

作用: 将库链接到目标(如可执行文件或另一个库)。

target_link_libraries(MyApp PRIVATE MyLib) # 链接 MyLib 库到 MyApp 可执行文件 
2.5. set

作用: 设置变量,可以是编译选项、路径或用户自定义变量。

set(CMAKE_CXX_STANDARD 17) # 设置 C++ 标准为 C++17 
2.6. include_directories

作用: 指定头文件搜索路径。

include_directories(${CMAKE_SOURCE_DIR}/include) # 添加 include 文件夹到头文件搜索路径 
2.7. add_subdirectory

作用: 将子目录添加到构建中,允许多目录组织项目。

add_subdirectory(src) # 将 src 子目录添加到构建 
2.8. find_package

作用: 查找外部库或包,并设置必要的链接和头文件路径。

find_package(OpenCV REQUIRED) # 查找 OpenCV 库,REQUIRED 表示未找到时报错 target_link_libraries(MyApp PRIVATE ${OpenCV_LIBS}) # 链接 OpenCV 库到 MyApp 
2.9. install

作用: 定义安装目标(如可执行文件、库、头文件等)。

install(TARGETS MyApp DESTINATION bin) # 将 MyApp 可执行文件安装到 bin 目录 
install(FILES myheader.h DESTINATION include) # 安装头文件到 include 目录 
2.10. option

作用: 定义选项,允许用户在生成时启用或禁用特定功能。

option(ENABLE_TESTS "Enable test builds" ON) # 定义是否启用测试,默认开启 
2.11. if/else/endif

作用: 条件编译,类似于其他编程语言中的条件语句。

if(ENABLE_TESTS) add_subdirectory(tests) # 如果 ENABLE_TESTS 为 ON,添加 tests 目录 endif() 

3. 示例

简单示例
cmake_minimum_required(VERSION 3.10) 
# 定义项目 
project(MyApp LANGUAGES CXX) 
# 设置 C++ 标准 
set(CMAKE_CXX_STANDARD 17) 
# 指定可执行文件 
add_executable(MyApp main.cpp) 
# 添加头文件路径 
include_directories(${CMAKE_SOURCE_DIR}/include) 
# 链接库(如果有其他库) 
# target_link_libraries(MyApp PRIVATE MyLib) 
带外部依赖库的示例(使用 OpenCV)
cmake_minimum_required(VERSION 3.10) 
project(MyApp LANGUAGES CXX) 
set(CMAKE_CXX_STANDARD 17) 
# 查找 OpenCV 库 
find_package(OpenCV REQUIRED)
# 指定可执行文件 
add_executable(MyApp main.cpp) 
# 链接 OpenCV 库 
target_link_libraries(MyApp PRIVATE ${OpenCV_LIBS}) 
多目录示例
cmake_minimum_required(VERSION 3.10) 
project(MyProject LANGUAGES CXX) 
# 设置 C++ 标准 
set(CMAKE_CXX_STANDARD 17) 
# 添加子目录 
add_subdirectory(src) 
add_subdirectory(tests) 
# 安装可执行文件 
install(TARGETS MyApp DESTINATION bin) 
含条件编译和选项的示例
cmake_minimum_required(VERSION 3.10) 
project(MyProject LANGUAGES CXX) 
set(CMAKE_CXX_STANDARD 17) 
# 定义选项 
option(ENABLE_TESTS "Enable test builds" ON) 
# 添加可执行文件 
add_executable(MyApp main.cpp) 
# 如果启用了测试,添加测试目录 
if(ENABLE_TESTS) 
   add_subdirectory(tests) 
endif() 

4. 规则与最佳实践

  1. 明确指定 CMake 最低版本: 使用 cmake_minimum_required() 指定最低版本,确保构建脚本的兼容性。
  2. 合理组织项目目录: 使用 add_subdirectory() 管理子目录,保持项目的清晰和模块化。
  3. 充分利用变量和选项: 使用 set()option() 定义灵活的构建选项,方便用户自定义构建过程。
  4. 查找和使用外部库: 使用 find_package() 查找外部依赖库,确保项目可以正确链接外部库。
  5. 条件编译与跨平台支持: 使用 if()else() 进行条件编译,编写可跨平台的 CMake 脚本。

通过这些规则和命令,可以灵活地定义构建流程,使项目具备良好的可维护性和跨平台兼容性。


http://www.kler.cn/news/309346.html

相关文章:

  • 【LabVIEW学习篇 - 25】:JKI状态机
  • I2C/IIC学习笔记
  • nonlocal本质讲解(前篇)——从滤波到Nonlocal均值滤波
  • Java项目实战II基于Spring Boot的宠物商城网站设计与实现
  • linux-软件包管理-包管理工具(Debian 系)
  • 【C++入门学习】7. 类型
  • Java项目实战II基于Java+Spring Boot+MySQL的服装厂服装生产管理系统的设计与实现
  • 归并排序
  • Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法
  • [ffmpeg]音频格式转换
  • matlab绘制不同区域不同色彩的图,并显示数据(代码)
  • 【每日一题】LeetCode 2848.与车相交的点(数组、哈希表、前缀和)
  • python知识点100篇系列(18)-解析m3u8文件的下载视频
  • 东土科技加码芯片业务投资,携手神经元共建新型工业生态
  • 【开放词汇检测】基于MMDetection的MM-Grounding-DINO实战
  • 动态ip切换过快,会引起我的账号下次登录异常吗
  • CentOS详细解析及其配置方法
  • golang 字符串浅析
  • 使用Python实现深度学习模型:智能家电控制与优化
  • Nginx搭建直播服务器,并用rtmp,http-flv,hls三种模式拉流观看直播的流程
  • iOS 知识点记录
  • 区块链积分系统:革新支付安全与用户体验的未来
  • 【Petri网导论学习笔记】Petri网导论入门学习(三)
  • 启信产业大脑助力市北高新园区数字化升级,开启智慧园区新篇章
  • 自己建网站怎么建
  • OpenCV结构分析与形状描述符(24)检测两个旋转矩形之间是否相交的一个函数rotatedRectangleIntersection()的使用
  • 网络安全学习(五)Burpsuite实战
  • 解决Matlab报错:MEX 文件 ‘D:\MATLAB\toolbox\maple\maplemex.mexw64‘ 无效: 缺少依赖共享库
  • 2024年某大厂HW蓝队面试题分享
  • Github打不开解决方法