CMake 简要内容

CMake 是cross platform make的简写,从这里你完全可以看出,CMake是基于Make来实现相关的内容的,换句话说,CMake就是在Make的基础上抽象出来的更高级的框架。

CMakeLists.txt的编译test.cpp生成test可执行文件的基本例子:

cmake_minimum_required(VERSION 2.8.10)
SET(PROJECT_NAME test)
project(${PROJECT_NAME})
add_executable(test test.cpp)  

通过以下Shell Command:

mkdir -p build && cd build && cmake .. && make 

通过上文的shell命令,其实你也已经发现了,cmake会生成Makefile,然后我们需要调用make来生成可执行文件。

CMakeLists.txt 编写要点

常用的cmake指令解释

cmake_minimum_required(VERSION xxx) #cmake最小版本需求,新版本的cmake改了很多东西,提升了便利性,也可能让你自己挖坑了
project(xxx) #设置此项目的名称
add_executable(target target_source_codes) #生成可执行文件target ,后面填写的是生成此可执行文件所依赖的源文件列表。
SET(var_name var_value)# 设置一个名字var_name 的变量,同时给此变量赋值为var_value
MESSAGE("MSG") #类比echo 打印消息
option(var_name "comment" var_value) #给变量var_name赋值为var_value,comment是此变量的注释,和SET 有类似的功效,用于给某变量设置默认值
include_directories(xxx) #添加include路径,也就是 gcc -I xxx 的意思,或者vs ide中添加头文件包含目录
add_subdirectory(xxx) #调用xxx子目录的CMakeLists.txt执行
add_compile_options(xxx) #给编译器添加xxx参数,但是貌似没有什么用,我一般不这样添加参数,不直接
link_directories(xxx) #给编译器添加库目录,也就是 gcc -L xxx 的意思,或者vs ide中添加库的包含目录
add_library(lib_name SHARED or STATIC lib_source_code) #和add_executable类似,生成库文件,SHARED代表动态库,STATIC代表静态库, 最后一个参数代表此库的源文件列表,此指令只有三个参数
target_link_libraries(target_name lib_name ...) #给目标添加依赖库,类似与gcc -l lib_name,此指令有两个用处,一个是给可执行target_name 添加库依赖,二是给库target_name 添加库依赖。

我常见的cmake指令也就是上述的这些,还有部分比较常见的指令这里没有列出,我放到了下面单独讲解如:install()

cmake 流控制指令相关

条件语句

if(xxx)
...
elseif(xx)
...
else()
...
endif()#常见条件语句用法为:
# if (va)  va为bool型
# if (va MATCHES xxx) va 是string类型,如果va包含了xxx,则此句为真

循环语句

foreach(va va_lists)
...
endforeach()

在foreach中,va的值会依次被va_lists的值替换

macro 和 function

macro(name arg ...)
...
endmacro()
function(name arg ...)
...
endfunction()

宏和函数效果都类似,唯一区别为function中的变量为局部的。

install 指令(主要是生成Makefile中的install target)

install(FILES flie DESTINATION dir_path) #执行make install时,把file拷贝到dir_path
install(PROGRAMS file DESTINATION dir_path) #执行make install时,把file拷贝到dir_path,并给予file可执行权限
INSTALL(TARGETS  ylib ylib_s#RUNTIME DESTINATION xxxLIBRARY DESTINATION libARCHIVE DESTINATION lib
)# 安装libylib.so到lib目录,安装libylib_s.a到lib目录,RUNTIME 是安装可执行文件到xxx目录,注意这个指令有个坑,我后面会说明这个问题。

configure_file指令

configure_file(fileA fileB @ONLY)
#把fileA 复制并重命名为fileB,此时,fileA中的@var@的值会被替换为cmakelists.txt 中var的值。@ONLY是只转换@va@这种变量

CMakeLists.txt常用的内置变量

CMAKE_INSTALL_PREFIX  #make install 的安装路径
CMAKE_BUILD_TYPE #生成的目标为debug或者release
CMAKE_C_FLAGS #gcc 的编译参数指定,这个非常好用,一般通过set 修改其值
CMAKE_CXX_FLAGS #g++ 和上面CMAKE_C_FLAGS 类似
CMAKE_CURRENT_SOURCE_DIR # 当前CMakeLists.txt所在的目录,主要用来定位某文件
CMAKE_CURRENT_BINARY_DIR # 当前CMakeLists.txt对应的编译时的目录

XXXConfig.cmake文件(cmake模块文件)编写以及引用

yLibConfig.cmake

find_path(yLib_INCLUDE_DIR NAMES ylib.h PATHS @CMAKE_INSTALL_PREFIX@/include) find_library(yLib_LIBRARY NAMES ylib PATHS @CMAKE_INSTALL_PREFIX@/lib)
#find_library 会到@CMAKE_INSTALL_PREFIX@/lib目录查询libylib.soset(yLib_FOUND TRUE)
set(yLib_INCLUDE_DIRS ${yLib_INCLUDE_DIR})
set(yLib_LIBS ${yLib_LIBRARY}) mark_as_advanced(yLib_INCLUDE_DIRS yLib_LIBS )

XXX_INCLUDE_DIR 
XXX_LIBRARY 
XXX_FOUND 
XXX_INCLUDE_DIRS 
XXX_LIBS 
以上变量最好都定义了,不然find_package可能会报错 
.cmake 文件就是定义了相关include变量和lib变量,没有什么其他的东西

调用:

set(yLib_DIR "@CMAKE_INSTALL_PREFIX@/cmake")
#设置.cmake 的目录所在
find_package(yLib REQUIRED)
#find_package会导入.cmake 中的相关变量,完成相关模块的导入

一个关于install()指令的深坑

INSTALL(TARGETS  ylib ylib_s#RUNTIME DESTINATION xxxLIBRARY DESTINATION libARCHIVE DESTINATION lib
)
#对于RUNTIME  和 LIBRARY 两种目标,在安装时候,cmake会默认给你移除掉目标文件中的gcc的Wl,rpath的值,导致某些库找不到的错误。
以下变量会影响此坑,更详细的信息去查查别的资料,我这里就不详细说明了。
#set(CMAKE_SKIP_BUILD_RPATH FALSE)
#set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
#set(CMAKE_INSTALL_RPATH "")
#set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
#set(CMAKE_SKIP_INSTALL_RPATH TRUE)
#set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")#set(CMAKE_SKIP_RPATH TRUE)
#set(CMAKE_SKIP_INSTALL_RPATH TRUE)

注意:cmake会直接修改你的二进制文件替换掉rpath的相关信息。默认替换的值是一个空值,也就是说移除掉了你设置的rpath的值

转载地址:https://blog.csdn.net/u011728480/article/details/81480668

CMakeLists.txt 介绍相关推荐

  1. CMakeLists.txt的语法介绍和几个实例

    参考 https://blog.csdn.net/afei__/article/details/81201039 https://www.bilibili.com/video/BV12f4y1X7Jm ...

  2. cmake 编译文件 CMakeLists.txt 语法介绍与实例演练

    一.Cmake 简介 cmake 是一个跨平台.开源的构建系统.它是一个集软件构建.测试.打包于一身的软件.它使用与平台和编译器独立的配置文件来对软件编译过程进行控制. 二.常用命令 1. 指定 cm ...

  3. CMakeLists.txt文件如何编写?(一 基础篇)

    本文首发于微信公众号「3D视觉工坊」--CMakeLists.txt文件如何写? 本文以linux平台下CMakeLists.txt文件书写方法总结. 一 开头通用模块 1.1 cmake版本要求 c ...

  4. gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习

    说明 编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程 ...

  5. PX4 CMakeLists.txt 文件剖析

    PX4 CMakeLists.txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析, 见这里, 这里进一步对 PX4 的 CMakeLists.txt 文件结构进行进一步的 ...

  6. 熟悉 CMake(二)—— 以一个实例说明 CMakeLists.txt 文件的编写

    原文请见 cmake使用总结(转)-工程主目录CMakeList文件编写 在 Linux 下进行开发很多人选择编写 makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量 ...

  7. Android-JNI开发系列《八》CMakeLists.txt语法使用

    人间观察 带饭去上班的都是成年人的奢侈品! 技术永远在不断的更新升级,Android也一样. 目前在Android中的JNI开发都是采用的CMake进行编译c,c++代码来构建项目,早期都是Andro ...

  8. CMakeLists.txt 详解

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

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

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

  10. TVM示例展示 README.md,Makefile,CMakeLists.txt

    TVM示例展示 README.md,Makefile,CMakeLists.txt TVM/README.md Open Deep Learning Compiler Stack Documentat ...

最新文章

  1. python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
  2. 【Python】详解Pandas与Lambda结合进行高效数据分析
  3. Selenium Grid Node 安装配置(CentOS 7 版)
  4. Unity3D两种方式播放视频
  5. 白嫖船长几节课(2)
  6. rest php,REST介绍与REST在PHP中的应用
  7. 凸优化第二章凸集 2.1 仿射集合和凸集
  8. web.config中文解释
  9. html开网站弹窗代码大全,网页弹窗代码大全
  10. ubuntu install wiznote
  11. python snownlp了解_python中snownlp情感分析简易的demo分享
  12. 图像的二维傅里叶变换的频谱图代码实现
  13. 怎么看计算机运行时间,怎么查看电脑运行时间_怎么查看电脑运行记录
  14. Lotus Notes 7.0找不到服务器路径
  15. 机器学习中常用的几何距离测量和统计距离测量方法总结
  16. Android隐藏的权限管理机制:AppOps
  17. Android 性能优化 (一)APK高效瘦身
  18. leetcode 18. 四数之和 (C++)
  19. AWVS多平台安装(保姆级)教程
  20. 曼谷这些旅游景点文化地标推荐

热门文章

  1. .dat文件写入byte类型数组_不可不知的可变Java长数组
  2. mysql 驱动指令_Mysql的驱动包如何发送指令给MYSQL SERVER
  3. 不能将紧实的字段 绑定到_紫光芯城市政配套建设项目样板段预计下月完成
  4. java spark命令行执行参数
  5. mysql 全文所有_MySQL中的全文搜索
  6. linux 反汇编 静态库,如何反汇编.lib静态库?
  7. Java集合源码分析(一):数组与链表
  8. mysql 问题:Unknown system variable 'query_cache_size'
  9. 算法篇(一)直接插入排序与快速排序
  10. linux oracle 分号引起大错误