CMake教程7:CMake的命令行使用姿势

3,183 阅读5分钟

前期你可以借助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步走

  1. CMakeLists.txt的同级目录执行,就会在构建结果生成在build目录,这个目录会有非常多的文件,包括构建编译的中间文件都在这个目录

    cmake -S ./ -B ./build  
    
  2. 在上一步的build目录中执行make,即可编译链接生成目标程序。

    cd ./build
    make
    
  3. 在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 StudioXcode 等 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