如何在管理项目时更多的使用modern cmake,更具有规范性
Cmake如何构建项目
cmake -S . -B build
cmake --build build
Cmake如何安装
From the build directory (pick one)
make install
cmake --build . --target install
cmake --install . # CMake 3.15+ only
From the source directory (pick one)
make -C build install
cmake --build build --target install
cmake --install build # CMake 3.15+ only
Cmake标准选项
大部分软件包中都会用到以下的 CMake 选项:
-DCMAKE_BUILD_TYPE= 从 Release, RelWithDebInfo, Debug, 或者可能存在的更多参数中选择。 -DCMAKE_INSTALL_PREFIX= 这是安装位置。UNIX 系统默认的位置是 /usr/local,用户目录是 ~/.local,也可以是你自己指定的文件夹。 -DBUILD_SHARED_LIBS= 你可以把这里设置为 ON 或 OFF 来控制共享库的默认值(不过,你也可以明确选择其他值而不是默认值) -DBUILD_TESTING= 这是启用测试的通用名称,当然不会所有软件包都会使用它,有时这样做确实不错。
Cmake应注意行为
- 不要使用具有全局作用域的函数
- 不要添加非必要的 PUBLIC 要求
- 不要在file函数中添加 GLOB 文件
- 将库直接链接到需要构建的目标上
- 当链接库文件时,不要省略 PUBLIC 或 PRIVATE 关键字
Cmake流程
设置一个项目
project(MyProject VERSION 1.0
DESCRIPTION "Very nice project"
LANGUAGES CXX)
生成一个可执行文件
add_executable(one two.cpp three.h)
生成一个库
add_library(one STATIC two.cpp three.h)
目标时常伴随着你
target_include_directories(one PUBLIC include)
PUBLIC 对于一个二进制目标没有什么含义;但对于库来说,它让 CMake 知道,任何链接到这个目标的目标也必须包含这个目录。其他选项还有 PRIVATE(只影响当前目标,不影响依赖),以及 INTERFACE(只影响依赖)。
add_library(another STATIC another.cpp another.h)
target_link_libraries(another PUBLIC one)
another会去寻找one库。
target_link_directories(subtraction PUBLIC /public/dir INTERFACE /interface/dir)
subtraction会去指定的相对路径或者绝对路径去找想要链接的库文件。