CMake 的编译目标
编译目标
在 CMake 中,编译目标主要指的是项目中要生成的执行文件、库文件等。这些目标是通过 add_executable、add_library 等命令定义的。编译目标让 CMake 知道如何将源代码文件编译链接成最终的可执行文件或库。
编译目标的定义允许 CMake 管理和优化整个构建过程,包括:
- 确定哪些源文件属于哪个目标。
- 处理目标之间的依赖关系。
- 配置目标的编译选项、定义宏等。
- 确定链接时需要包含哪些库。
CMake是一个跨平台的自动化构建系统,它使用文本文件(通常命名为CMakeLists.txt)来定义项目的构建环境。在CMake中,你可以定义多种编译目标,包括可执行文件、静态库和动态库。
常用的定义编译目标的操作
可执行文件 (add_executable)
使用add_executable命令来定义一个可执行文件的编译目标。你需要指定可执行文件的名称和构成该可执行文件的源文件。
静态库 (add_library...STATIC)
使用add_library命令并指定STATIC关键字来定义一个静态库的编译目标。静态库在程序链接时会被完整地复制到最终的可执行文件中。
动态库/共享库 (add_library...SHARED)
使用add_library命令并指定SHARED关键字来定义一个动态库(或称为共享库)的编译目标。动态库在程序运行时被载入。
模块库 (add_library...MODULE)
用于创建一个在运行时通过dlopen在应用程序中动态加载的库,而不是在应用程序启动时链接。
接口库 (add_library...INTERFACE)
用于仅仅定义接口,它不编译成实际的文件,但可以携带使用需求,供其他目标链接使用。
添加一个可执行文件
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(MyExecutableProject)
# 定义一个可执行文件“MyExecutable”及其所需的源文件
add_executable(MyExecutable main.cpp)
添加一个静态库
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(MyStaticLibraryProject)
# 定义一个静态库“MyStaticLib”及其源文件
add_library(MyStaticLib STATIC library.cpp library.h)
添加一个动态库
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(MySharedLibraryProject)
# 定义一个动态库“MySharedLib”及其源文件
add_library(MySharedLib SHARED library.cpp library.h)
在这些例子中,cmake_minimum_required 指令用来指定CMake的最低版本要求,project 命令用于定义项目的名称,而 add_executable 和 add_library 则分别用于定义可执行文件和库的编译目标。
Install 目标
install 用于指定在安装时运行的规则。它可以用来安装很多内容,可以包括目标二进制、动态库、静态库以及文件、目录、脚本等
CMake 项目中可以没有 install 命令。使用 install 命令是为了定义如何安装(即将构建好的目标文件、库文件、头文件等复制到系统的指定位置)你的项目或库,这对于最终用户来说非常重要,因为它简化了软件的部署和分发过程。然而,如果你的项目仅仅是为了开发或内部使用,或者不需要安装到系统的特定位置,那么可以不使用 install 命令。
install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
参数中的 TARGET 可以是很多种目标文件,最常见的是通过 ADD_EXECUTABLE 或者 ADD_LIBRARY 定义的目标文件,即可执行二进制、动态库、静态库:
| 目标文件 | 内容 | 安装目录变量 | 默认安装文件夹 |
| -------------- | ----------------------- | --------------------------- | -------------- |
| ARCHIVE | 静态库 | ${CMAKE_INSTALL_LIBDIR} | lib |
| LIBRARY | 动态库 | ${CMAKE_INSTALL_LIBDIR} | lib |
| RUNTIME | 可执行二进制文件 | ${CMAKE_INSTALL_BINDIR} | bin |
| PUBLIC_HEADER | 与库关联的PUBLIC头文件 | ${CMAKE_INSTALL_INCLUDEDIR} | include |
| PRIVATE_HEADER | 与库关联的PRIVATE头文件 | ${CMAKE_INSTALL_INCLUDEDIR} | include |