CMake 命令行参数

  • 前言
  • CMake命令行参数
    • -G:指定生成器。
      • 生成器
    • -D:定义CMake变量。
  • -B:指定构建目录。
  • -E:调用CMake内置命令。
    • 其他常用参数
  • CMake命令行参数的使用实例
    • 指定构建类型为Release:
    • 指定安装目录为/usr/local:
    • 指定使用Android NDK作为交叉编译工具链:
    • 指定使用C++11标准:
    • 定义CMake变量:
    • 调用CMake内置命令echo:
    • 指定构建目录:
    • 指定使用gcc编译器:
    • 指定构建共享库:
    • 指定生成的可执行文件和库文件的输出目录:
    • 指定使用Ninja生成器:
    • 指定CMake模块路径:
    • 指定导出编译命令:
    • 指定运行时动态链接库搜索路径:
    • 指定使用Clang编译器且开启优化选项:
    • 指定使用Debug构建类型:
    • 指定使用Release构建类型,并生成Makefile文件:
    • 指定第三方库安装路径:
    • 指定使用GCC编译器且开启调试信息:
  • 总结

前言

CMake是一个跨平台的构建系统生成工具,可以自动生成Makefile或者其他构建系统所需的文件。CMake的优点包括可移植性、易于使用、可扩展性和高效性,因此越来越多的项目开始采用CMake作为构建工具。在使用CMake构建项目时,我们需要编写CMakeLists.txt文件来描述项目的构建过程,并且使用cmake命令生成Makefile文件。除此之外,CMake还支持许多命令行参数,这些参数可以帮助我们更加灵活地控制构建过程,根据具体的项目需求进行设置。本文将介绍常用的CMake命令行参数及其使用实例,帮助读者更好地使用CMake进行项目构建。


CMake命令行参数

-G:指定生成器。

生成器

生成器是一个特定于构建系统的工具,用于将CMake生成的Makefile或项目文件转换为实际的可执行文件、静态库或动态库。不同的构建系统有不同的生成器,每个生成器都可以将CMake生成的文件转换为适用于特定构建系统的文件。
例如,Unix Makefile生成器生成适用于Unix/Linux系统的Makefile文件,Ninja生成器生成适用于Ninja构建系统的项目文件,Visual Studio生成器生成适用于Visual Studio IDE的项目文件,等等。
生成器通过读取CMake生成的文件并将其转换为构建系统可以使用的文件来执行其工作。例如,Unix Makefile生成器将CMake生成的Makefile文件转换为实际的可执行文件、静态库或动态库。
总之,生成器是一个特定于构建系统的工具,用于将CMake生成的Makefile或项目文件转换为实际的可执行文件、静态库或动态库。不同的构建系统有不同的生成器,每个生成器都可以将CMake生成的文件转换为适用于特定构建系统的文件。
使用该参数可以指定使用的生成器,例如Unix Makefiles、Ninja、Visual Studio等。
在CMake中,-G参数用于指定生成器,即用于生成特定构建系统的Makefiles或项目文件。不同的构建系统有不同的生成器可以选择,例如Unix Makefiles、Ninja、Visual Studio等。

下面是一些常用的-G参数:

-G "Unix Makefiles":生成适用于Unix/Linux系统的Makefile文件。
例如:

cmake -G "Unix Makefiles" ..
-G Ninja:生成适用于Ninja构建系统的项目文件。
例如:

cmake -G Ninja ..
-G “Visual Studio 16”:生成适用于Visual Studio 2019的项目文件。
例如:

cmake -G "Visual Studio 16" ..
-G “Xcode”:生成适用于Xcode IDE的项目文件。
例如:

cmake -G "Xcode" ..
-G “CodeBlocks – Unix Makefiles”:生成适用于Code::Blocks IDE的Makefile文件。
例如:

cmake -G "CodeBlocks - Unix Makefiles" ..
总之,-G参数用于指定生成器,帮助CMake生成适用于特定构建系统的Makefiles或项目文件。不同的构建系统有不同的生成器可以选择,您可以根据自己的需要选择适合的生成器。


-D:定义CMake变量。

-D参数可以用于在CMake中定义变量并将其传递给CMakeLists.txt文件,这些变量可以用于控制构建过程中的行为。具体而言,-D参数可以用于:
定义变量并设置其值,例如:-DVAR_NAME=VALUE。
定义布尔类型的变量,其值为ON,例如:-DVAR_NAME。
定义路径类型的变量,例如:-DVAR_NAME:PATH=/path/to/dir。
定义配置变量(缓存变量),例如:-DVAR_NAME:STRING=VALUE。
这些变量可以在CMakeLists.txt文件中使用,并在构建过程中控制Makefile的生成行为。


-B:指定构建目录。

在CMake中,-B参数用于指定生成的构建目录,即将CMake生成的Makefile或项目文件保存到指定的目录中。这个目录可以是相对路径或绝对路径。
例如:
cmake -B build ..
这将生成一个名为build的构建目录,并将生成的Makefile或项目文件保存到该目录中。
您也可以使用绝对路径来指定构建目录,例如:
cmake -B /path/to/build ..
这将生成一个名为build的构建目录,并将生成的Makefile或项目文件保存到/path/to/build目录中。
总之,-B参数用于指定生成的构建目录,即将CMake生成的Makefile或项目文件保存到指定的目录中。这使得我们可以将源码和构建过程分开,以便更好地管理项目。


-E:调用CMake内置命令。

在CMake中,-E参数用于执行一些与构建无关的命令,例如创建目录、复制文件、压缩文件等。这些命令不会生成Makefile或项目文件,而是在构建之外执行。

下面是一些常用的-E参数:

-E make_directory
:创建一个目录。
例如:

cmake -E make_directory build
这将在当前目录下创建一个名为build的目录。

-E copy :将一个文件从源路径复制到目标路径。
例如:

cmake -E copy data.txt build/data.txt
这将将data.txt文件从当前目录复制到build目录中。

-E tar [ ...]:压缩指定的文件为tar格式的归档文件。
例如:

cmake -E tar myarchive.tar file1.txt file2.txt
这将创建一个名为myarchive.tar的tar归档文件,其中包含file1.txt和file2.txt。

-E remove_directory
:递归删除一个目录。
例如:

cmake -E remove_directory build
这将递归删除build目录及其所有子目录和文件。

总之,-E参数用于执行与构建无关的命令,例如创建目录、复制文件、压缩文件等。这些命令不会生成Makefile或项目文件,而是在构建之外执行。这使得我们可以在构建过程之外执行一些必要的操作,例如在构建之前创建目录,或在构建之后删除临时文件。


其他常用参数

  • -DCMAKE_BUILD_TYPE:指定构建类型。使用该参数可以指定构建类型,例如Debug、Release等。
  • -DCMAKE_C_COMPILER:指定C编译器。使用该参数可以指定使用的C编译器,例如gcc、clang等。
  • -DCMAKE_CXX_COMPILER:指定C++编译器。使用该参数可以指定使用的C++编译器,例如g++、clang++等。
  • -DCMAKE_TOOLCHAIN_FILE:指定交叉编译工具链。使用该参数可以指定交叉编译工具链,例如Android NDK、iOS SDK等。
  • -DCMAKE_SYSTEM_NAME:指定目标系统名称。使用该参数可以指定目标系统的名称,例如Linux、Windows、Android、iOS等。
  • -DCMAKE_INSTALL_RPATH:指定运行时动态链接库搜索路径。使用该参数可以指定运行时动态链接库搜索路径,使得程序在运行时可以找到所需的动态链接库。
  • -DCMAKE_C_FLAGS:指定C编译器选项。使用该参数可以指定C编译器的选项,例如-O0、-O2等。
  • -DCMAKE_CXX_FLAGS:指定C++编译器选项。使用该参数可以指定C++编译器的选项,例如-std=c++11、-stdlib=libc++等。
  • -DBUILD_SHARED_LIBS:指定是否构建共享库。使用该参数可以指定是否构建共享库,如果指定为ON,则生成共享库,否则生成静态库。
  • -DCMAKE_VERBOSE_MAKEFILE:指定生成Makefile时是否显示详细信息。使用该参数可以指定是否显示详细的构建信息。
  • -DCMAKE_MODULE_PATH:指定CMake模块路径。使用该参数可以指定CMake的模块路径,以便CMake可以找到所需的模块。
  • -DCMAKE_EXPORT_COMPILE_COMMANDS:指定是否导出编译命令。使用该参数可以指定是否导出编译命令,以便其他工具可以使用编译命令。
  • -DCMAKE_PREFIX_PATH:指定第三方库安装路径。使用该参数可以指定第三方库的安装路径,以便CMake可以找到所需的库文件。
  • -DCMAKE_INSTALL_PREFIX:指定安装目录。使用该参数可以指定安装目录,使得在执行make install命令时,生成的可执行文件、库文件、头文件等可以被安装到指定的目录下。

CMake命令行参数的使用实例

下面是一些CMake命令行参数的使用示例:

指定构建类型为Release:

cmake -DCMAKE_BUILD_TYPE=Release /path/to/source

指定安装目录为/usr/local:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local /path/to/source

指定使用Android NDK作为交叉编译工具链:

cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/android.toolchain.cmake /path/to/source

指定使用C++11标准:

cmake -DCMAKE_CXX_FLAGS=-std=c++11 /path/to/source

定义CMake变量:

cmake -DVAR=value /path/to/source

调用CMake内置命令echo:

cmake -E echo "Hello World"

指定构建目录:

cmake -B /path/to/build /path/to/source

指定使用gcc编译器:

cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ /path/to/source

指定构建共享库:

cmake -DBUILD_SHARED_LIBS=ON /path/to/source

指定生成的可执行文件和库文件的输出目录:

cmake -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/path/to/bin -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/path/to/lib /path/to/source

指定使用Ninja生成器:

cmake -G Ninja /path/to/source

指定CMake模块路径:

cmake -DCMAKE_MODULE_PATH=/path/to/modules /path/to/source

指定导出编译命令:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /path/to/source

指定运行时动态链接库搜索路径:

cmake -DCMAKE_INSTALL_RPATH=/path/to/lib /path/to/source

指定使用Clang编译器且开启优化选项:

cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS=-O2 -DCMAKE_CXX_FLAGS=-O2 /path/to/source

指定使用Debug构建类型:

cmake -DCMAKE_BUILD_TYPE=Debug /path/to/source

指定使用Release构建类型,并生成Makefile文件:

cmake -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" /path/to/source

指定第三方库安装路径:

cmake -DCMAKE_PREFIX_PATH=/path/to/third_party /path/to/source

指定使用GCC编译器且开启调试信息:

cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_FLAGS=-g -DCMAKE_CXX_FLAGS=-g /path/to/source


总结

综上所述,CMake是一个强大的跨平台构建系统生成工具,可以自动生成Makefile或者其他构建系统所需的文件。CMake的命令行参数可以帮助我们更加灵活地控制构建过程,根据具体的项目需求进行设置,以便生成所需的构建结果。
在使用CMake构建项目时,我们可以根据项目的需求选择不同的命令行参数,以便生成所需的构建结果。同时,我们还可以通过定义CMake变量和调用CMake内置命令等方式来进行更加灵活的控制。总之,CMake的命令行参数是非常有用的工具,对于需要使用CMake进行项目构建的开发者来说,掌握这些命令行参数是非常重要的。
希望本文对读者在使用CMake时有所帮助。如果读者有任何疑问或建议,欢迎在评论区留言。