一:CMakeLists.txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件

学习cmake需要提前了解gcc等编译命令,先来解释一条最简单的命令

gcc ./source/*.c -o ./bin/test -I ./include -L ./lib/ -l动态库名

上述命令的解释为:用gcc工具编译当前目录下source文件夹中的所有的.c文件 生成目标为test的可执行文件且将其放在当前目录下的bin文件夹中,其所用到的头文件所在路径为当前目录下的include文件夹,动态库文件路径为当前目录下的lib文件夹,编译时需要用到的动态库为库名所对应的.so动态库

二:CMakeList.txt规则文件常用变量

(1)常用变量

PROJECT_NAME:用函数project(demo)指定的项目名称,这里变量的值为demo

PROJECT_SOURCE_DIR:工程的根目录

PROJECT_BINARY_DIR:执行cmake命令的目录,如果mkdir build ,cd build, cmake ../,的话,该变量的值为build目录

CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在目录

CMAKE_CURRENT_BINARY_DIR:cmake当前正在处理的二进制目录

CMAKE_CURRENT_LIST_DIR:CMakeLists.txt的完整路径

CMAKE_CURRENT_LIST_LINE:当前所在行

CMAKE_C_FLAGS:设置C编译选项

CMAKE_CXX_FLAGS:设置C++编译选项

CMAKE_INSTALL_PREFIX:指定install指令安装文件的根目录

EXECUTABLE_OUTPUT_PATH:生成目标可执行文件的输出位置

LIBRARY_OUTPUT_PATH:库文件输出位置

三:指令详解

需要注意的是CMakeLists.txt文件中的指令不区分大小写

(1)PROJECT(projectname [CXX] [C] [Java]):

该函数定义工程名字,并指定了工程的语言,支持语言的列表可以省略,默认情况下表示支持所有语言,并隐式定义了两个cmake的变量

PROJECT_BINARY_DIR:执行cmake的目录

PROJECT_SOURCE_DIR:工程的根目录

(2).SET(<variable> <value>... [PARENT_SCOPE])

显式设置普通变量

variable:只能有一个;
        value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值;
        PARENT_SCOPE(父作用域):作用域,除PARENT_SCOPE外还有function scope(方法作用域)和directory scope(目录作用域)。

2.set(<variable> <value>... CACHE <type> <docstring> [FORCE]) #设置缓存条目

variable:只能有一个
        value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值
        CACHE:关键字,说明是缓存变量设置
        type(类型):必须为以下中的一种:
                BOOL:有ON/OFF,两种取值
                FILEPATH:文件的全路径
                PATH:目录路径
                STRING:字符串
                INTERNAL:字符串
        docstring:总结性文字(字符串)
        [FORCE]:变量名相同,第二次调用set方法时,第一次的value将会被覆盖

3.set(ENV{<variable>} [<value>]) #设置环境变量

variable:只有一个

  value:一般来说,只有一个,为空时,将清除之前设置的变量值,多个时,取值最近的一个,之后的值将被忽略

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin):设置可执行文件的输出路径为build/bin

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib):设置库文件的输出路径为build/lib

(3)include_directories(xxx)

给工程添加头文件,例如使用opencv时需要包含/usr/local/include/opencv/cv.h这个头文件,则我们需要include_directories(/usr/local/include),在调用的函数里写 #include “opencv/cv.h”即可

target_include_directories()

为指定的目标添加搜索头文件

include_directories()和target_include_directories()区别

include_directories 会为当前CMakeLists.txt的所有目标,以及之后添加的所有子目录的目标添加头文件搜索路径。因此,慎用,会影响全局target

target_include_directories 只会为指定目标包含头文件搜索路径。如果想为不同目标设置不同的搜索路径,target_include_directories 更合适

例:target_include_directories(test xxx ${PROJECT_SOURCE_DIR}/include)

如果xxx为PRIVATE 则表示头文件只能由 test使用

如果xxx为INTERFACE 则表示头文件只能由 调用test的文件使用

如果xxx为PUBLIC 则test和任何调用test的文件都能使用头文件

(4)add_executable(可执行文件名 1.cpp 2.ppp …)

添加可执行文件,其中可执行文件需要用到1.cpp和2.cpp 工程会给1.cpp和2.cpp编译生成一个可执行文件

(5)add_library(生成的库名称 STATIC/SHARED 源文件.cpp)

将源文件生成 静态/动态 库文件 STSTIC 表示静态库最终会编入到可执行文件中,SHARED(常见参数)表示动态库(又称共享库)方式

(6)target_link_libraries (库/可执行文件 library1 library2 ...)

为库或者可执行文件添加需要链接的库

注:需要放在add_executable之后

(7)add_subdirectory(source_dir)

向当前工程添加存放其他源文件的子目录,用于多目录下都有CMakeLists.txt文件的情况

(8)aux_source_directory( 文件目录 变量名)

把文件目录下的所有源文件储存在变量中

例:aux_source_directory(${PROJECT_SOURCE_DIR}/ DIR_SRCS) 表示把工程目录的源文件添加到DIR_SRCS变量中

(9)message(模式 "output msg" )

打印输出信息,常见模式有FATAL_ERROR、WARNING、STATUS、DEBUG等

(10)find_package(<NAME> 版本号 EXACT/QUIET/REQUIRED)

version:指定查找库的版本号。 EXACT:要求该版本号必须精确匹配。 QUIET:禁掉没有找到时的警告信息。如果没找到则忽略这一问题,继续执行 REQUIRED选项表示如果包没有找到的话,CMake的过程会终止,并输出警告信息

当find_package找到一个库的时候,以下变量会自动初始化:

<NAME>_FOUND : 显示是否找到库的标记
<NAME>_INCLUDE_DIRS 或 <NAME>INCLUDES : 头文件路径
<NAME>_LIBRARIES 或 <NAME>_LIBS : 库文件

注:如果CMake自动找不到路径,我们需要手动设置路径,如 先 set(OpenCV_INCLUDE_DIRS “home/hwh/Opencv3.1/build”) 设置路径 然后find_package(OpenCV 3.1 REQUIRED)

(11)file(GLOB 变量 "路径")

会在路径下查找目标文件并保存在变量中

(12)execute_process(COMMAND shell命令 WORKING_DIRECTORY shell命令的工作目录)

执行shell命令
(13)foreach(var ${list})

xxx

endforeach()

变量var从list中取值,并循环执行xxx命令

(14)install指令

install(TARGETS a.a b.so exe ARCHIVE a.a  DESTINATION lib/  LIBRARY b.so DESTINATION lib/ RUNTIME exe DESTINATION bin/)

TARGETS:通过ADD_EXECUTABLE ADD_LIBRARY定义的目标文件,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制,DESTINATION定义了安装的路径

FILE:普通文件的安装

PROGRAMS :可执行脚本

DIRECTORY:目录安装

(15)add_definitions()

向编译器添加-D定义,如ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格隔开

如果代码中定义了#ifdef ENABLE_DEBUG #endif,这个代码块就会生效

如果要添加其他编译器开关,可以通过CMAKE_C_FLAGS变量和CMAKE_CXX_FLAGS变量设置

(16)ADD_DEPENDENCIES()

定义target依赖其他的target,确保在编译本target之前,其他的target以及被构建

(17)FILE()

文件操作指令

(18)include(file OPTIONAL)

用于载入CMakeLists.txt文件和.cmake文件,模块文件搜索路径与CMAKE_MODULE_PATH

变量指定的路径有关,OPTIONAL参数作用是即使文件不存在也不报错

(19)find_xxx(<VAR> name1 path1 path2)

查找相应的文件,VAR变量表示找到文件的全路径

(20)

function的定义格式如下:后面可作为命令供调用

function(<name> [<arg1> ...])

        <commands>

endfunction()

其中name是function的名字,参数为arg1, arg2等。

注意:变量的取值使用${},但在if控制语句中和直接使用变量名

Make VERBOSE=1可以看到makefile执行的详细步骤

CMAKE_INCLUDE_PATH 与CMAKE_LIBRARY_PATH是环境变量,两者都被用于find_path

CMakeLists.txt详解相关推荐

  1. CMakeLists.txt 详解

    目录 CMakeLists.txt用例详解(WDS中的用例) CMakeLists.txt作用 生成对象库OBJECT实例(wds/libwds/common/CMakeLists.txt) 生成库s ...

  2. 【每天学习一点新知识】robots.txt详解

    目录 什么是robots.txt? 如何查看robots.txt? robots.txt的内容 常见的搜索引擎的蜘蛛名称 如果创建并上传robots.txt文件? 如果网站信息都需要被抓取,是不是可以 ...

  3. python 多数据输出到txt_详解python读取和输出到txt

    读取txt的数据和把数据保存到txt中是经常要用到的,下面我就总结一下. 读txt文件 python常用的读取文件函数有三种read().readline().readlines() 以读取上述txt ...

  4. 【转载】CMake 语法 - 详解 CMakeLists.txt

    作者:红橙Darren 链接:https://www.jianshu.com/p/528eeb266f83 来源:简书 目录 1. 初试 cmake 的 helloworld 2. 构建生成 .so ...

  5. adb logcat 保存_adb命令——日志命令详解——全部输出到桌面: adb logcat c:\users\del\desktop\log.txt...

    adb logcat 一.在cmd窗口查看手机的Log日志 有时候我们在手机程序上的日志要在其他地方调试,然后要看里面的Log日志.在cmd窗口中输入如下命令: //格式1:打印默认日志数据 adb ...

  6. Robots.txt 协议详解及使用说明

    一.Robots.txt协议 Robots协议,也称为爬虫协议.机器人协议等,其全称为"网络爬虫排除标准(Robots Exclusion Protocol)".网站通过Robot ...

  7. python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取

    #2018-04-06 07:57:00 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘笔记]二十.KNN最近邻分类算法分析详解及平衡 ...

  8. caffe学习之——CMakeList.txt内容详解

    在对Caffe使用cmake方式编译安装时产生了对这个文件的好奇,打算做个注释理解, 参考:https://blog.csdn.net/fuzi2012/article/details/7245453 ...

  9. java读写json格式的文件方法详解.txt,并批量存储进redis

    捐躯赴国难,视死忽如归.恸哭六军俱缟素,冲冠一怒为红颜.君子坦荡荡,小人长戚戚.风日晴和人意好,夕阳箫鼓几船归.民为贵,社稷次之,君为轻.Java 读写json格式的文件方法详解 文章录入:7747. ...

最新文章

  1. python第三方库下载-3、python第三方库的安装方式
  2. 【Python科学计算系列】概率论与数理统计
  3. python生成json_如何将Python数组转为Json格式数据并存储?
  4. php label,HTML的label标签
  5. 搭建私域流量池实施落地——四大运营步骤
  6. python怎么更改背景颜色_python中绘图时怎么改背景颜色?
  7. 20191208_神经网络交叉验证
  8. 五、文章详情页制作及跳转功能实现《iVX低代码/无代码个人博客制作》
  9. 软件需求说明书(GB856T——88)
  10. 记一次无意间的bypass云锁的SQL注入
  11. 两款程序员的好帮手——BitNami,Hoo WinTail
  12. 矩阵在游戏开发中的应用
  13. 离婚后发现对方婚内出轨,还能否要赔偿
  14. 阿里云是干什么用的?
  15. 《构建之法》第4.17章读书笔记
  16. 2018 Google IO干货摘要及对国内Android开发者的影响
  17. ReactNative的SDK打包后给到其他项目集成
  18. [台剧]《倚天屠龙记》永远的经典——孙兴版杨逍
  19. 关于 SCJP 1.4 考试
  20. 网络爬虫框架——Scrapy框架解析

热门文章

  1. 美国硅谷银行倒闭之后,会产生什么样的影响
  2. HNCPC2019-K-双向链表练习题(好题)
  3. 解释结构模型ISM-2-5
  4. Spring | 三分钟带你了解什么是Spring
  5. python中开根号_python中根号怎么表示
  6. app的appPackage、appActivity,获取方法之一
  7. Windows 11 on ARM Insider Preview 下载
  8. 加拿大魁北克投资移民申请费用一览表
  9. 安科瑞ARC系列功率因数补偿控制器
  10. 智慧工地、智慧工厂、智慧电力、危化品行业等有哪些AI盒子产品及优势呢?其中安全生产有哪些人工智能AI产品的厂家及电话,有没有相应的系统平台呢