[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_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 预定义变量的主要内容,如果未能解决你的问题,请参考以下文章