CMakeLists.txt的学习了解

news/2024/9/18 23:10:10 标签: 编辑器

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.niftyadmin.cn/n/5664672.html

相关文章

【AI学习笔记】初学机器学习西瓜书概要记录(二)常用的机器学习方法篇

初学机器学习西瓜书的概要记录(一)机器学习基础知识篇(已完结) 初学机器学习西瓜书的概要记录(二)常用的机器学习方法篇(持续更新) 初学机器学习西瓜书的概要记录(三)进阶知识篇(待更) 文字公式撰写不易&am…

上汽集团社招入职SHL测评:语言理解及数字推理高分攻略、真题题库

上汽集团社招待遇 上汽集团作为国内领先的汽车制造企业,其社招待遇和面试问题一直是求职者关注的焦点。以下是根据最新信息整理的上汽集团社招待遇及面试问题概览: 工资待遇:上汽集团的工资待遇在国内汽车行业中属于较高水平。根据不同职位和…

【MQTT协议使用总结】基于-FreeRTOS平台-移植MQTT协议栈

文章目录 仓库地址关键接口适配FreeRTOS_readFreeRTOS_writeNetworkInit && NetworkConnect && NetworkDisconnect 总结 仓库地址 https://github.com/eclipse/paho.mqtt.embedded-c 这里官方给了一些平台适配案例,这里参考FreeRTOS的 关键接口适配…

1. 如何在Java中连接MySQL数据库?请解释使用JDBC连接的步骤。

要在Java中连接MySQL数据库,通常使用JDBC(Java Database Connectivity)API。这是一个用于执行SQL语句的Java API,可以用来访问关系型数据库。下面是使用JDBC连接MySQL数据库的详细步骤: 1. 添加MySQL JDBC驱动 首先&a…

python函数一:函数的概念、函数定义与调用、函数的参数、函数的返回值、说明文档以及函数的嵌套调用

文章目录 1. 函数介绍1.1 函数的概念1.2 函数定义与调用1.2 函数的参数1.3 函数的返回值1.4 说明文档 2. 函数的嵌套调用2.1 嵌套调用及执行流程2.2 嵌套调用的应用 1. 函数介绍 1.1 函数的概念 什么是函数? 函数:是一个被命名的、独立的、完成特定功能的代码段&am…

设计模式学习[6]---代理模式

文章目录 前言1.原理阐述2.举例2.1 例子与类图2.2 代码 总结 前言 代理这个词,从小到大听过不少。比如什么代理服务器,代理商,代理人之类的。通俗来说,代理无非无非就是我代表你处理事务的意思。 那么在设计模式中,针…

Java 中的 FileWriter:用法详解与实战

FileWriter 是专门用于将字符写入文件的便捷类。它继承自 OutputStreamWriter,属于字符流类的一个部分,适合用于处理文本文件的写入操作。 1. FileWriter 概述 FileWriter 主要用于将字符数据写入到文件中。如果文件不存在,它会自动创建&…

四、JVM原理-4.1、JVM介绍

4.1、JVM介绍 4.1.1、如何理解Java虚拟机,它的结构是如何设计的? 答: Java虚拟机(Java Virtual Machine,JVM)是Java语言编写的程序在运行时的执行环境。它是Java的核心组成部分,负责解释和执行…