一.语法
1.set变量赋值:
1)非if语句中
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-pthread")
将“”内复制给前面的变量
2)if语句中
if (NOT JSBSIM_FOUND)
区别:非if语句需要加上${}
二.常见变量名
1. CMAKE_C_COMPILER:指定C编译器
2. CMAKE_CXX_COMPILER:指定C++编译器
3. CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项
如:SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -pthread")
4. EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径
5. LIBRARY_OUTPUT_PATH:库文件路径
6. CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug
BUILD_SHARED_LIBS:Switch between shared and static libraries
7. CMAKE_CURRENT_LIST_DIR:当前cmake的路径,可与add_definitions()连用,用在工程代码中调用变量
内置变量的使用:
>> 在CMakeLists.txt中指定,使用set
>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF
三.常见指令
1. cmake_minimum_required (VERSION 2.8.11)
#指定cmake最小编译版本
2. project (HELLO) #指定项目名称,生成的项目名称
3. include_directories(include)
#给cmakelist所有目标的源文件指定头文件的搜索路径,相当于指定gcc的-I参数
例:include_directories (/src/include)
#${HELLO_SOURCE_DIR}表示项目根目录
#增加Hello为include目录
4. target_include_directories(HELLO PUBLIC
/src/include)
#给特定目标(如例HELLO) 指定头文件的搜索路径
#INTERFACE
:target对应的头文件使用PRIVATE
:target对应的源文件使用PUBLIC
:target对应的头文件、源文件都使用
区别:“指定目标“
5. link_directories
#动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
例: link_directories (${HELLO_BINARY_DIR}/Hello)
#增加Hello为link目录
6. target_link_libraries
#给指定目标搜索库路径
区别:”指定目标“
7. add_subdirectory(Hello)
#包含子目录
8. add_executable
#编译可执行程序,指定编译
例:add_executable (helloDemo demo.cxx demo_b.cxx) ,可将多个cxx文件编译为一个可执行文件
9. add_definitions
#添加编译参数
例:add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;
例:add_definitions( “-Wall -ansi –pedantic –g”)
10. add_library
例:add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a
11.find_package(MAVLink REQUIRED)
#查找库的头文件路径和库文件路径,并赋值给${MAVLink_INCLUDE_DIRS},${MAVLink_LIBRARIES},这些路径在后续被include_directories和include_link_libraries调用
注意:find_package搜索路径原理特殊
find_package采用两种模式搜索库:
1)Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成(先搜索当前项目里面的Module文件夹里面提供的FindXXX.cmake,然后再搜索系统路径/usr/local/share/cmake-x.y/Modules/FindXXX.cmake
2)Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件,执行该文件从而找到XXX库。其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。
3)对于可能没有***.cmake和***Config.cmake的库文件,可以直接找到其头文件和库文件所在文件夹,直接进行路径赋值,而直接查找头文件和库文件的指令为:
例:
find_path(JSBSIM_INCLUDE_DIR
NAMES
FGFDMExec.h
PATHS
${JSBSIM_ROOT_DIR}/include/JSBSim
/usr/include/JSBSim
/usr/local/include/JSBSim
)find_library(JSBSIM_LIBRARY
NAMES JSBSim
PATHS
${JSBSIM_ROOT_DIR}/lib
/usr/lib/
/usr/local/lib
)
而后赋值给target_include_directories
12. message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
#执行cmake时打印消息(可用来查找错误)
例:message(STATUS "catkin DISABLED")
13. add_definitions(-DJSBSIM_ROOT_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
#-D需注意,别忘了加,中间没有空格
#宏定义,与C语言中的#define一个意思,可在源文件.cpp中进行调用,例句含义为,将CMAKE_CURRENT_SOURCE_DIR宏定义为JSBSIM_ROOT_DIR
14. option(TEST_IF_CMAKE “test” OFF)
#选择项,“test”不输出,是解释项
例:
option(TEST_IF_CMAKE “test” OFF)
if(TEST_IF_CMAKE)
add_definitions(-DJSBSIM_ROOT_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
endif()
在终端输入cmake -TEST_IF_CMAKE=ON,开关打开,进行宏定义,输入OFF,则关闭