CMakeList写作规范整理

仅作为学习笔记整理

转载cmake使用方法详解(转载) - 长老猪 - 博客园,并添加整理

一.语法

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采用两种模式搜索库:(转载find_package()函数_古路的博客-CSDN博客_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,则关闭

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值