cmake入门实战
使用 cmake 进行交叉编译
CMake 编译选项设置
cmake时添加-fPIC编译选项
cmake官网和官方文档
一、预定义变量
1、宏
CMAKE_CXX_STANDARD 设置gcc标准,-std=c++11
PROJECT_SOURCE_DIR 工程的根目录
PROJECT_BINARY_DIR 运行cmake命令时所在的目录
CMAKE_INCLUDE_PATH 环境变量
CMAKE_LIBRARY_PATH
CMAKE_CURRENT_SOURCE_DIR 当前在处理的CMakeLists.txt所在目录
CMAKE_CURRENT_BINARY_DIR target编译目录
CMAKE_CURRENT_LIST_FILE 调用这个变量的CMakeLists.txt所在的完整路径
CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt所在的完整路径
2、文件设置
# 设置编译模式,debug/release
set(CMAKE_BUILD_TYPE "Debug")
# debug/release的编译选项
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 也可以直接设置编译选项
set(CMAKE_CXX_FLAGS ...)
# 设置编译器
# 这两条命令应该放在文件的开始位置(cmake_minimum_required命令之下,其他命令之上),否则可能无效
set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")
3、支持的flags变量
CMAKE_C_FLAGS :C语言编译器选项,对应于环境变量CFLAGS
CMAKE_CXX_FLAGS :C++语言编译器选项,对应于环境变量CXXFLAGS
CMAKE_CUDA_FLAGS :CUDA语言编译器选项,对应于环境变量CUDAFLAGS
CMAKE_Fortran_FLAGS :Fortran语言编译器选项,对应于环境变量FFLAGS
二、cmake编译宏
宏:-D 在命令行使用-D定义宏,在CMakeLists.txt里面可以用set定义宏
CMAKE_CXX_COMPILER 指定c++编译工具
CMAKE_CXX_FLAGS 指定c++编译参数,
CMAKE_C_COMPILER 指定c编译工具
CMAKE_C_FLAGS 指定c编译参数,相当于CFLAGS
CMAKE_TOOLCHAIN_FILE 指定cmake文件,这个文件可以定义一系列的CMAKE_前缀变量
CMAKE_INSTALL_PREFIX 指定cmkae的安装目录(make install)
CMAKE_CXX_STANDARD 指定g++的标准,用set的时候类似 –std=c++11
CMAKE_C_STANDARD指定gcc的标准,用set的时候类似 –std=c11
EXECUTABLE_OUTPUT_PATH 指定exe文件最终输出文件夹
LIBRARY_OUTPUT_PATH 指定lib文件最终输出文件夹
三、cmake的方法(函数)
findpackage()
add_definitions()
添加编译选项,多个可以用空格隔开,实际上可以用它来添加宏定义,添加-std=c++11/c11
add_compile_options(-std=c++11)
添加编译选项(gcc和g++都添加),类似CMAKE_CXX_FLAGS和CMAKE_C_FLAGS,
set()
设置一个变量,也可以用来定义宏,也可以定义其他的环境变量
add_dependencies(taget depend1 …)
给目标添加依赖,在编译目标前会先编译被依赖的目标,多个依赖用空格分开
aux_source_directory(dirname arg)
把指定文件夹下所有的源文件名列表加入到指定变量中
include(file)
导入其他CMakeLists.txt文件
file(cmd filename arg …) 对文件操作
cmd read/write/append/copy/rename/…
install()
安装,与CMAKE_INSTALL_PREFIX有关
四、自己创建函数(function)和宏(macro)
五、cmake语法if-else/while/foreach
六、cmake与/或/非
关键字:
and/or/not
七、CMakeLists.txt文件编辑
1、cmake版本要求
cmake_minimun_required(VERSION version)
2、添加一个可执行文件编译目标
add_executable(target sourcefile …)
3、添加一个动态/静态库的编译目标
add_library(target SHARED/STATIC sourcefile …)
4、给编译目标链接库
target_link_libraries(target –lxxx …)
5、设置变量(可以用这种方法定义宏,只针对宏有内容情况)
set(arg content)
例:
set(EXECUTABLE_OUTPUT_PATH dirname) # 指定exe文件最终的输出路径
set(LIBRARY_OUTPUT_PATH dirname) # 指定lib文件最终的输出路径
这2个设置一般是紧紧跟随同一个CMakeLists.txt文件的add_executable()/add_library()
6、定义宏,格式跟命令行一样
add_definitions(命令行定义宏样式)
例如:add_definitions(-DDEBUG)
7、包含子目录(包含子目录的CMakeLists.txt文件)
add_subdirectory(dirmane)
8、指定头文件扫描目录
include_directories(dirname)
9、指定库扫描目录
link_directories(dirname)
10、消息打印
# 输出非重要消息
message(STATUS "")
# 输出警告消息
message(WARNING "")
# ...
可以设置不同的消息等级,设置如下:
(无) = 重要消息;
STATUS = 非重要消息;
WARNING = CMake 警告, 会继续执行;
AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
FATAL_ERROR = CMake 错误, 终止所有处理过程;
11、file命令
file(cmd filename arg1 arg2 ...)
12、在目录中查找所有源文件,文件列表存在variable中
aux_source_directory(<dir> <variable>)
13、在目录中扫描所有符合条件的文件,GLOB只有本地有效,GLOB_RECURSE子文件也有效
file(GLOB USER_LIBS_PATH ./src/*.cpp)
file(GLOB_RECURSE USER_LIBS_PATH ./src/*.cpp)