CMake 完整入门教程(四)

11 CMake 常用变量 英文版的全部列表在这里: http://www.cmake.org/Wiki/CMake_Useful_Variables
11.1 CMake 系统信息
以下皆为字串类型
CMAKE_SYSTEM
系统全名,如 "Linux-2.4.22" "FreeBSD-5.4-RELEASE" "Windows 5.1"
CMAKE_SYSTEM_NAME
系统名称,如 "Linux" "FreeBSD" or "Windows"
CMAKE_SYSTEM_VERSION
只有 CMAKE_SYSTEM 当中版本的部分
CMAKE_SYSTEM_PROCESSOR
CPU 名称,如 "Intel(R) Pentium(R) M processor 2.00GHz"
CMAKE_GENERATOR
在命令列所指定的 Generator 名称
11.2 系统旗标
以下皆为 BOOL 类型,若是与目前所属的操作系统 / 编译器相符,其值为 True ,否则为
False
UNIX
如果为真,表示为 UNIX-like 的系统,包括 Apple OS X CygWin
WIN3
如果为真,表示为 Windows 系统,包括 CygWin
MINGW CYGWIN MSYS 亦为 True
APPLE
如果为真,表示为 Apple 系统 MINGW
MSYS
CYGWIN
BORLAND
WATCOM
MSVC MSVC_IDE CMAKE_COMPILER_2005 MSVC60 MSVC70 MSVC71
MSVC80 MSVC90 MSVC10
不同版本的微软 Visual C++ 专案档
CMAKE_COMPILER_IS_GNUCC
目前使用 GNU C 编译器
CMAKE_COMPILER_IS_GNUCXX
目前使用 GNU C++ 编译器
CMAKE_SIZEOF_VOID_P
表示 void* 的大小(例如为 4 或者 8 ),可以使用其来判断当前构建为 32 位还是 64
11.3 资料夹和档案信息
CMAKE_SOURCE_DIR
内容为 source tree 根目录的完整路径,也就是 CMake 开始建置过程的进入点。
CMAKE_BINARY_DIR
内容为 binary tree 根目录的完整路径,在 in-source build 的时候值与 CMAKE_SOURCE_DIR
相同。
PROJECT_SOURCE_DIR
目前正在处理中的专案最上层目录,即内含 project() 指令的 CMakeLists 所在资料夹。
PROJECT_BINARY_DIR 目前所属专案的建置根目录。在 in-source build 时和 PROJECT_SOURCE_DIR 相同。
CMAKE_CURRENT_SOURCE_DIR
目前正在处理的 CMakeLists.txt 所在位置。
CMAKE_CURRENT_BINARY_DIR
目前正在处理的 CMakeLists.txt 对应的建置资料夹位置。在 in-source build 时和
CMAKE_CURRENT_SOURCE_DIR 相同。
CMAKE_CURRENT_LIST_DIR
表示正在处理的 CMakeLists.txt 文件的所在的目录的绝对路径( 2.8.3 以及以后版本才支
持)
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
用于设置 ARCHIVE 目标的输出路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY
用于设置 LIBRARY 目标的输出路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY
用于设置 RUNTIME 目标的输出路径
11.4 编译选项
BUILD_SHARED_LIBS
将所有程式库 target 设成共享程式库,只对未指定类型的程式库有效。
CMAKE_BUILD_TYPE
控制建置类型,值可为下列之一 :
None: 编译器默认值
Debug: 产生除错信息
Release: 进行最佳化
RelWithDebInfo: 进行最佳化,但仍然会启用 DEBUG flag
MinSizeRel: 进行程式码最小化
特别要注意的是, CMAKE_BUILD_TYPE configuration time 不会自动初始化为可读取的变
量,必须要在使用者指定建置类型后才可以利用。
C 编译标志相关变量
CMAKE_C_FLAGS
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
是在呼叫 C 编译器时附加的额外选项。其中:
CMAKE_C_FLAGS CMAKE_CXX_FLAGS 可以指定编译标志
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO] 则指定特定构建类型
的编译标志,这些编译标志将被加入到 CMAKE_C_FLAGS CMAKE_CXX_FLAGS 中去,例
如,如果构建类型为 DEBUG ,那么 CMAKE_CXX_FLAGS_DEBUG 将被加入到
CMAKE_CXX_FLAGS 中去。
C++ 编译标志相关变量
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
同上,但作用在 C++ 编译器 。
链接标志相关变量
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO] 它们类似于编译标志相关变量。如 CMAKE_EXE_LINKER_FLAGS 是生成执行档时所使用的连
结选项。 CMAKE_SHARED_LINKER_FLAGS 是生成 shared library 时所使用的连结选项。
12 自定义编程语言
在默认的情况下 CMake 会启用 C C++ 两种编程语言, CMake 内建了几种常见 C C++
译器的相关知识,通常我们不需要费心思去操心编译细节。如果是 CMake 不认得的编程语
言或编译器,就需要指定相关的编译规则。
举个具体的例子,撰写 Win32 程式时常用到 Windows Resource 语言,必须将 .rc 档案编译
.res 档,再和其他 C C++ .obj 连结成最后的程式。在 Visual C++ 这并不会造成任何困
扰,只要把 .rc 档当成一般的源代码一起给 add_executable() 等指令, Visual C++ 的统一
编译窗口 cl.exe 会自动处理,不劳您费心。然而其它的编译器未必有如此贴心的服务,例
MinGW gcc 就不会主动呼叫 windres 来编译资源档,我们必须手动指定。
利用 enable_language() 可以启用一个编程语言,通常还必须要设定几个变量告诉 CMake
个语言的编译器名称、源代码附档名、输出档附档名、命令列格式等等。由于 CMake
resource file 已经有部分的知识,我们只要设定编译器名称和用法即可。
if(MINGW)  
  set(CMAKE_RC_COMPILER_INIT windres)  
  enable_language(RC)  
  set(CMAKE_RC_COMPILE_OBJECT  
    "  -O coff  -i  -o ")  
endif()

然后将 .rc 档当成一般的源代码加到 add_executable() add_library() 之中, CMake 就会自
动辨识 .rc 档并且用上面 CMAKE_RC_COMPILE_OBJECT 给定的命令列格式编译。
  1. 识别MinGW环境

if(MINGW)

这一行检查是否正在使用MinGW编译器。MinGW是一个用于编译Windows应用程序的GCC工具集。
2. 设置资源编译器

set(CMAKE_RC_COMPILER_INIT windres)

这行指定用于编译资源文件的编译器为windreswindres是MinGW的一部分,用于将.rc文件编译为.o对象文件。
3. 启用RC语言

enable_language(RC)

这行告诉CMake启用RC语言。这意味着CMake知道如何处理.rc文件。
4. 设置资源编译命令

set(CMAKE_RC_COMPILE_OBJECT
" -O coff -i -o ")

这里定义了如何编译一个.rc源文件。具体来说,它指定了如何使用windres编译器来编译资源文件。例如,它指定了输出格式为coff(Common Object File Format),这是Windows可执行文件的标准格式。
5. 添加.rc文件到可执行文件或库中
一旦您设置了CMake以识别和处理.rc文件,您可以将这些文件视为常规的源代码文件,并将其添加到add_executable()add_library()中。CMake会自动知道如何处理这些文件,并使用上面定义的命令进行编译

你可能感兴趣的:(C++项目开发基础,c++)