前期你可以借助vscode,进行cmake的构建编译和运行,一些开源的c++项目也是在使用cmake构建,大部分情况下,都需要使用命令行进行构建编译,本节教程就仔细聊聊CMake的命令行使用姿势,这对学习开源项目很有帮助。
CMake的全部命令
cmake --help
Options
-S <path-to-source> = Explicitly specify a source directory. # 源文件目录
-B <path-to-build> = Explicitly specify a build directory. # 构建输出目录
-D <var>[:<type>]=<value> = Create or update a cmake cache entry. # 传递参数
-G <generator-name> = Specify a build system generator. # 生成工程文件
以上就是CMake的全部命令选项,以下是我个人使用心得:
编译链接项目3步走
-
在
CMakeLists.txt的同级目录执行,就会在构建结果生成在build目录,这个目录会有非常多的文件,包括构建编译的中间文件都在这个目录cmake -S ./ -B ./build -
在上一步的build目录中执行
make,即可编译链接生成目标程序。cd ./build make -
在build目录你会看到生成结果,如果是lib项目,一般我们都希望将库文件和头文件提取出来,执行以下命令即可:
make install默认文件会提取到
/usr/local等一些系统目录,当然可以设置CMAKE_INSTALL_PREFIX指定目录。
命令行传递参数
假如我们有如下的CMakeLists.txt,里面有如下的控制逻辑:
if(CPP_TEST)
# todo
endif()
我们希望通过命令行能够控制这部分逻辑,那么我们可以这样做
cmake -D CPP_TEST=false
注意: 这里一定要是-D再加上变量名,-D是选项
本质上是传递一个变量给CMakeLists.txt使用,这个变量也可以是CMAKE的内部变量,比如上边的CMAKE_INSTALL_PREFIX变量:
dir=$(pwd)
cmake \
-S ./ \
-B ./build \
-D CMAKE_INSTALL_PREFIX="$dir" \
我们编译一些开源项目,经常会编写以上的shell脚本进行项目的编译,而通过-D传递参数会经常使用,具体传递哪些变量,还要看CMakeLists.txt里面的逻辑,一般都会有变量影响编译结果。
生成IDE项目
cmake -G "Xcode" -B ./proj-mac
生成IDE项目,可以帮助我们更加清楚的看到项目结构,同时也方便我们编写项目代码。
每种操作系统的Generator都是不同的,具体可以在help中找到。
我经常会在外部新建好源文件,然后修改CMakeLists.txt,同时再次生成IDE项目,回到IDE编辑器中都会提示刷新项目,就会看到刚才新建的源码,然后再进行编码工作,整个流程体验还是非常不错的。
CMake内部构建
在源代码目录中进行构建,生成的目标文件也会放在源代码目录中。
这种方式简单方便,适合于小型项目或者快速开发、测试的场景。
使用内部构建时,可以直接进入源代码目录,并执行 cmake 命令生成 Makefile 文件,然后使用 make 或其他构建工具进行构建。例如:
cd myproject
cmake .
make
以上命令中,首先进入 myproject 目录,然后执行 cmake . 命令,在当前目录中查找 CMakeLists.txt 文件并生成 Makefile 文件,最后使用 make 命令进行构建。
需要注意的是,由于内部构建和源代码目录在同一目录下,因此生成的构建文件和目标文件也会混杂在源代码目录中,可能会导致源代码目录变得混乱或不可维护。
此外,在使用版本控制系统管理源代码时,应该把构建文件和目标文件加入到忽略列表(.gitignore)中,避免将无用的文件提交到版本库。
CMake外部构建
在源代码目录之外创建一个构建目录,在构建目录中生成 Makefile 或 Visual Studio 工程文件,然后进行构建。
这种方式可以避免把构建文件混杂在源代码目录中,使得源代码目录更加干净和可维护,一般我们都推荐使用的是这种方式。
使用外部构建时,需要先进入构建目录,然后执行 cmake 命令生成 Makefile 或 Visual Studio 工程文件,最后使用 make 或 Visual Studio 等工具进行构建。例如:
mkdir build && cd build
cmake ..
make
以上命令中,首先创建了一个 build 目录,并进入该目录。然后执行 cmake .. 命令,在上层目录中查找 CMakeLists.txt 文件并生成 Makefile 文件,最后使用 make 命令进行构建。
需要注意的是,由于外部构建和源代码目录是分离的,因此在编写 CMakeLists.txt 文件时需要采用相对路径或者变量来指定目录和文件,避免出现路径错误。
同时,需要保证外部构建目录与源代码目录隔离,不应该让构建目录中的文件或目录污染到源代码目录中。
构建debug/release
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build --config Debug
以上命令中,首先使用 cmake 命令指定了生成 Makefile 文件和构建类型为 Debug,然后使用 cmake --build 命令进行构建,并指定了构建类型为 Debug。
可选值有: Release/Debug/MinSizeRel
需要注意的是,cmake --config 命令只有在使用 Visual Studio 和 Xcode 等 IDE 时才会生效,使用 Makefile 进行构建时并不支持。
对于 Makefile 构建,应该通过 SET(CMAKE_BUILD_TYPE ) 或者通过编译器选项来指定配置类型。
COCOS2D-X举例
- 排除test项目
cmake -S ./ \
-B ./build-result \
-D BUILD_CPP_TESTS=false \
-D BUILD_CPP_EMPTY_TEST=false \
-D BUILD_JS_TESTS=false \
-D BUILD_LUA_TESTS=false \
-D BUILD_JS_LIBS=false
- 生成XCode工程
cmake -S ./ \
-G "Xcode" \
-B ../qt-editor/cocos.mac \
-D BUILD_CPP_TESTS=false \
-D BUILD_CPP_EMPTY_TEST=false \
-D BUILD_JS_TESTS=false \
-D BUILD_LUA_TESTS=false \
-D BUILD_JS_LIBS=false