一、变量的引用方式是使用“${}”
,在IF中,不需要使用这种方式,直接使用变量名即可
二、自定义变量使用SET(OBJ_NAME xxxx)
,使用时${OBJ_NAME}
三、cmake的常用变量:
CMAKE_BINARY_DIR
, PROJECT_BINARY_DIR
:这两个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录。
CMAKE_SOURCE_DIR
, PROJECT_SOURCE_DIR
:这两个变量内容一致,都指的是工程的顶级目录。
CMAKE_CURRENT_BINARY_DIR
:外部编译时,指的是target目录,内部编译时,指的是顶级目录
CMAKE_CURRENT_SOURCE_DIR
:CMakeList.txt所在的目录
CMAKE_CURRENT_LIST_DIR
:CMakeList.txt的完整路径
CMAKE_CURRENT_LIST_LINE
:当前所在的行
CMAKE_MODULE_PATH
:如果工程复杂,可能需要编写一些cmake模块,这里通过SET指定这个变量
LIBRARY_OUTPUT_DIR
, BINARY_OUTPUT_DIR
:库和可执行的最终存放目录
PROJECT_NAME
, CMAKE_PROJECT_NAME
:前者是当前CMakeList.txt里设置的project_name,后者是整个项目配置的project_name
四、cmake中调用环境变量
1. Using $ENV{NAME} : 调用系统环境变量,我们也可以使用 "SET(ENV{NAME} value)". 需要注意的是这里"ENV"没有"$".
2. CMAKE_INCLUDE_CURRENT_DIR 等同于 INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
五、其他的内置变量
-
BUILD_SHARED_LIBS
: set the default value when using ADD_LIBRARY() -
CMAKE_C_FLAGS
: set compiler for c language -
CMAKE_CXX_FLAGS
: set compiler for c++ language
六、区分debug和release
在工程build目录下执行 cmake .. -DCMAKE_BUILD_TYPE=DEBUG|RELEASE
,再执行make, 或者在顶级CMakeList.txt里加入: set(CMAKE_BUILD_TYPE Debug|Release|MinSizeRel|RelWithDebInfo)
七、指定编译32bit或64bit程序
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
八、通过cmake打印能获取到的所有系统环境变量
# 在CMakeList.txt中使用
execute_process(
COMMAND ${CMAKE_COMMAND} -E environment
)
# 在终端中使用
cmake -E environment
九、设置install路径
// 命令行里设置
cmake -DCMAKE_INSTALL_PREFIX=<install_path>
// 或者在根cmake里设置
SET(CMAKE_INSTALL_PREFIX <install_path>)
默认安装路径是/usr/local
十、获取绝对路径和父目录
# 获取文件绝对路径
get_filename_component(FULL_NAME "${FILE}" ABSOLUTE)
# 获取文件父路径
get_filename_component(PARENT_DIR "${FULL_NAME}" PATH)
十一、判断操作系统平台及Win是否为32位
if(CMAKE_SYSTEM_NAME MATCHES "Linux") // 注意区分大写
message(STATUS "Linux platorm!")
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
if(CMAKE_CL_64)
message(STATUS "Windows Win64 platform!")
else()
message(STATUS "Windows Win32 platform!")
endif(CMAKE_CL_64)
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
message(STATUS "FreeBSD platform!")
else()
message(STATUS "other platform!")
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
网友评论