CMake允许开发者编写一种平台无关的CMakeList.txt文件来定制整个编译流程,再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如Linux/Unix的Makefile或者Windows的VisualStudio工程等。
在Linux平台下使用cmake生成Makefile并编译的流程,如下:
1、 编写CMake配置文件CMakeLists.txt。
2、 执行命令cmake PATH或者ccmake PATH生成Makefile。其中,PATH是CmakeLists.txt所在目录。
3、 使用make命令进行编译。
查看cmake版本号:
@执行camke –version
CMakeLists.txt的常用命令函数
(1) CMake最低版本号要求
@cmake_minimum_required(VERSION 2.8)
(2) 项目信息
@project(PROJECT_NAME)
(3) 添加工程子目录
@add_subdirectory(SUB_DIRECTORY_PATH)
(4) 添加编译参数
添加DEBUG宏定义
@add_definitions(-DDEBUG)
编译参数
@add_definitions(“-Wall-ansi -pedantic -g”)
(5) 变量的使用,set定义变量及赋值
@set(EXT_LIBS ${EXT_LIBS} <lib_name1><lib_name2> <…>)
在变量EXT_LIBS列表后追加lib_name1、lib_name2等。
(6) 指定头文件的搜索路径,相当于指定gcc的-I参数
@include_directories(${PATH_DIR_INCLUDE_FILE})
(7) 扫描PATH目录下的所有源文件,并将文件保存到PATH_DIR_SRCS变量
@aux_source_directory(PATH_DIR_SRCS)
(8) 扫描PATH目录下的所有源文件,并生成链接库
@aux_source_directory(PATH_DIR_LIB_SRCS)
@add_library(LIB_NAME ${PATH_DIR_LIB_SRCS})//默认静态库,也可指定动态库
(9) 动静态链接库的搜索路径,相当于指定gcc的-L参数
@link_directories
(10) 添加链接库
@target_link_libraries(EXECUTE_FILE${EXT_LIBS})
(11) 指定生成目标
@add_executable(EXECUTE_FILE ${DIR_SRCS})
将DIR_SRCS变量中的源文件生成指定的EXECUTE_FILE(可执行文件)
(12) 列表操作
@list([APPEND|INSERT|LENGTH|REMOVE_ITEM|REMOVE_AT|SORT]…)
一些参数解释:
APPEND:追加若干元素
INSERT:在指定位置插入若干元素
LENGTH:返回list的长度
GET:返回list中所有被index索引的元素构成的list
REMOVE_ITEM:删除指定项
REMOVE_AT:删除指定索引处的项
SORT:按照字母顺序对list中的内容进行排序
REMOVE_DUPLICATES:删除list中的重复项
REVERSE:将list内容前后倒换
(13) 加入配置头文件,用于处置CMake对源码的设置
CMake对源码的设置,在加入project时,会自动引入PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR。
configure_file(
“${PROJECT_SOURCE_DIR}/config.h.in”
“${PROJECT_BINARY_DIR}/config.h”
)
@ccmake命令
选择方向键在窗口跳转选项,按下enter键可以修改该选项。修改完成后,按下c选项完成配置之后,再按g键确认生成Makefile。
(14) 输出信息
@MESSAGE([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]“message to display” …)
参数解释,用于指定消息的类型:
(无)——重要消息
STATUS——非重要消息
WARNING——CMake警告,会继续执行
AUTHOR_WARNING——CMake警告(dev),会继续执行
SEND_ERROR——CMake错误,继续执行,但是会跳过生成的步骤
FATAL_ERROR——CMake错误,终止所有处理过程
(15) 设置宏定义,一般用于区分是否使用库或者一些文件,常与if连用
@option(USE_MYMATH “Use provided mathimplementation” ON)
@if(USE_MATH)
@include_directories(“${PROJECT_SOURCE_DIR}/math”)
@add_subdirectory(math)
@set(EXTRA_LIBS ${EXTRA_LIBS}MathFunctionsFile)
@endif(USE_MYMATH)
(16) 生成安装包
(17) 安装
@install
(18) 测试CTest测试工具
#启动测试
@enable_testing()
#测试程序是否成功运行
@add_test(test_usage Demo)
@set_tests_properties(test_usage PROPERTIESPASS_REGULAR_EXPRESSION “Usage:.*base exponent”)
#测试5的平方
@add_test(test_5_2 Demo 5 2)
@set_tests_properties(test_5_2 PROPERTIESPASS_REGULAR_EXPRESSION “is 25”)
(19) 支持gdb
@set(CMAKE_BUILD_TYPE “Debug”)
@set(CMAKE_CXX_FLAGS_DEBUG “$ENV{CXXFLAGS}-O0 -Wall -g -ggdb”)
@set(CMAKE_BUILD_TYPE “Release”)
@set(CMAKE_CXX_FLAGS_RELEASE“$ENV{CXXFLAGS} -O3 -Wall”)