[4] CMake总结 - 1 预定义变量

Posted WhateverYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[4] CMake总结 - 1 预定义变量相关的知识,希望对你有一定的参考价值。

本帖子适用于初学者,StepByStep的入门CMake,CMake也是一门编程语言,只不过是针对编译和链接这种程序构建的过程的语言,学习基本语法就可以初步入门,后面需要什么复杂的功能,进阶掌握需要自己去查找官方文档,后续会给出查阅的一些方式

CMake预定义变量

基本变量

  • PROJECT_SOURCE_DIR cmake命令后紧跟的目录,一般是工程的根目录
  • PROJECT_BINARY_DIR 执行cmake命令的目录,通常是$PROJECT_SOURCE_DIR/build
  • CMAKE_INCLUDE_PATH 系统环境变量,非cmake变量
  • CMAKE_LIBRARY_PATH 系统环境变量,非cmake变量
  • CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
  • CMAKE_CURRENT_BINARY_DIR target编译目录
    使用ADD_SURDIRECTORY(src bin)可以更改此变量的值
    SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径
  • CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
  • CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
  • CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
    这个变量用于定义自己的cmake模块所在的路径,如果你的工程比较复杂,有可能自己编写一些cmake模块,比如SET(CMAKE_MODULE_PATH $PROJECT_SOURCE_DIR/cmake),然后可以用INCLUDE命令来调用自己的模块
  • EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
  • LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
  • PROJECT_NAME 返回通过PROJECT指令定义的项目名称
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式

环境变量

  • 使用$ENVNAME可以调用系统的环境变量,比如:
    MESSAGE(STATUS “HOME dir:”$ENVHOME)
  • 设置环境变量的方式,SET(ENVname value)
  • CMAKE_INCLUDE_CURRENT_DIR
    • 自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理
      的CMakeLists.txt。
      相当于在每个CMakeLists.txt加入:
      INCLUDE_DIRECTORIES($CMAKE_CURRENT_BINARY_DIR $CMAKE_CURRENT_SOURCE_DIR)
  • CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
    • 将工程提供的头文件目录始终至于系统头文件目录的前面,当你定义的头文件确实跟系统发
      生冲突时可以提供一些帮助。
  • CMAKE_INCLUDE_PATH、CMAKE_LIBRARY_PATH
    • 务必注意,这两个是环境变量而不是cmake变量。
    • 使用方法是要在bash中用export或者在csh中使用set命令设置或者CMAKE_INCLUDE_PATH=/home/include cmake ..等方式。

也就是,如果头文件没有存放在常规路径(/usr/include, /usr/local/include等),
则可以通过这些变量就行弥补。
比如hello.h存放在/usr/include/hello目录,所以直接查找肯定是找不到的。
前面我们直接使用了绝对路径INCLUDE_DIRECTORIES(/usr/include/hello)告诉工
程这个头文件目录。为了将程序更智能一点,
我们可以使用CMAKE_INCLUDE_PATH来进行,使用bash的方法
如下:
export CMAKE_INCLUDE_PATH=/usr/include/hello
然后在头文件中将INCLUDE_DIRECTORIES(/usr/include/hello)替换为:
FIND_PATH(myHeader hello.h)
IF(myHeader)
INCLUDE_DIRECTORIES($myHeader)
ENDIF(myHeader)

上述的一些指令我们在后面会介绍。
这里简单说明一下,FIND_PATH用来在指定路径中搜索文件名,比如:
FIND_PATH(myHeader NAMES hello.h PATHS /usr/include
/usr/include/hello)
这里我们没有指定路径,但是,cmake仍然可以帮我们找到hello.h存放的路径,就是因
为我们设置了环境变量CMAKE_INCLUDE_PATH。
如果你不使用FIND_PATH,CMAKE_INCLUDE_PATH变量的设置是没有作用的,你不能指
望它会直接为编译器命令添加参数-I。
以此为例,CMAKE_LIBRARY_PATH可以用在FIND_LIBRARY中。
同样,因为这些变量直接为FIND_指令所使用,所以所有使用FIND_指令的cmake模块都
会受益。

系统信息

  • CMAKE_MAJOR_VERSION cmake主版本号,如3.2.2中的3
  • CMAKE_MINOR_VERSION cmake次版本号,如3.2.2中的2
  • CMAKE_PATCH_VERSION cmake补丁等级,如3.2.2中的2
  • CMAKE_SYSTEM 系统名称,例如Linux-2.6.22
  • CAMKE_SYSTEM_NAME 不包含版本的系统名,如Linux
  • CMAKE_SYSTEM_VERSION 系统版本,如2.6.22
  • CMAKE_SYSTEM_PROCESSOR 处理器名称,如i686
  • UNIX 在所有的类UNIX平台为TRUE,包括OS X和cygwin
  • WIN32 在所有的win32平台为TRUE,包括cygwin

开关选项

  • BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库
  • CMAKE_C_FLAGS 设置C编译选项,也可以通过指令ADD_DEFINITIONS()添加
  • CMAKE_CXX_FLAGS 设置C++编译选项,也可以通过指令ADD_DEFINITIONS()添加。
  • CMAKE_C_COMPILER:指定C编译器
  • CMAKE_CXX_COMPILER:指定C++编译器
  • CMAKE_BUILD_TYPE::build 类型(Debug, Release, …),CMAKE_BUILD_TYPE=Debug

变量的使用

  • 在CMakeLists.txt中指定,使用set
  • cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

以上是关于[4] CMake总结 - 1 预定义变量的主要内容,如果未能解决你的问题,请参考以下文章

cmake使用示例与整理总结

11-cmake语法-内部变量-系统信息

cmake使用示例与整理总结

在 cmake 中将目标文件名作为编译定义传递

20175213 2018-2019-2 《Java程序设计》第10周学习总结

CMake--变量