目录
CMake详细教程
1 CMake简介
2 CMake特点
3 CMake安装
4 CMake使用注意事项
5 CMake常用指令介绍
5.1 CMake官方指令
5.2 CMake常用指令
5.3 静态库和共享库
6 ORB_SLAM2中Cmake文件解析
CMake 是"Cross platform MAke"的缩写,CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。
- Cmake 支持很多语言: C、C++、Java 等
- 跨平台使用,根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix的Makefile 或Windows 的 Visual Studio 工程
- 能够管理大型项目,比如OpenCV、Caffe、MySql Server
- 自动化构建编译,CMake 构建项目效率非常高
- 需要根据CMake 专用语言和语法来自己编写CMakeLists.txt 文件
- 如项目已经有非常完备的工程管理工具,并且不存在维护问题,没必要迁移到CMake
Windows下:Windows下Cmake安装步骤详解(图文)_cmake安装windows_L_Li_L的博客-CSDN博客
Linux下:Linux安装CMake_氷泠的博客-CSDN博客
- CMake 构建专用定义文件,文件名严格区分大小写
- 工程存在多个目录,可以每个目录都放一个CMakeLists.txt文件
- 工程存在多个目录,也可以只用一个CMakeLists.txt文件管理
- 不区分大小写,可以全用大写,全用小写,甚至大小写混合,自己统一风格即可
- 严格大小写相关。名称中只能用字母、数字、下划线、破折号
- 用${}来引用变量
- 参数之间使用空格进行间隔
5.1 CMake官方指令
Index — CMake 3.26.0-rc6 Documentation
5.2 CMake常用指令
以高翔《SLAM十四讲ch13》的案例为例。
(1)指定要求最小的cmake版本,如果版本小于该要求,程序终止
(2)设置当前项目名称
(3)设置模式
(4)指定头文件的搜索路径
- 指定头文件的搜索路径,编译器查找相应头文件
- 举例:include_directories("/usr/include/eigen3")查找eigen3库的路径
- CMakeLists.txt 中添加 include_directories(/usr/local/include)
(5)set用于给下面的变量设置值
参考文章:Cmake入门之——Set方法(六)_cmake set cache string_PGzxc的博客-CSDN博客
- 一般变量(Set Normal Variable)
- 缓存变量(Set Cache Entry)
- 环境变量(Set Environment Variable)
(6)添加可执行文件
- 用指定的源文件为工程添加可执行文件
- name:生成可执行文件的名字,必须在工程内全局唯一
- WIN32:有此参数时,WIN32_EXECUTABLE属性会被置为true,此时在windows环境下创建的可执行文件将以WinMain函数代替main函数作为程序入口,构建而成的可执行文件为GUI应用程序而不是控制台应用程序
- MACOSX_BUNDLE: 有此参数时,MACOSX_BUNDLE属性会被置为true,此时在macOS或者iOS上构建可执行文件目标时,目标会成为一个从Finder启动的GUI可执行程序
- EXCLUDE_FROM_ALL:有此参数时,此目标就会被排除在all target列表之外,即在执行默认的make时,不会构造此目标,需要构造此目标的时候,需要手动构建,如:
(7)生成链接库文件
- 将指定的源文件生成链接库文件。STATIC 为静态链接库,SHARED 为共享链接库
(8)添加库链接
- 为库或二进制可执行文件添加库链接,要用在add_executable之后。
(9)源文件向项目(project)添加可执行文件
- :导入可执行文件目标的名字
- :导入的目标文件需指定属性,属性指定后,目标文件的属性被置为,在工程内构建生成的可执行文件的属性会被置为。
(10)指明当前的执行程序依赖的动态库
- 为上层target添加依赖,一般不用
- 若只有一个targets有依赖关系,一般选择使用 target_link_libraries
- 如果两个targets有依赖关系,并且依赖库也是通过编译源码产生的。这时候用该指令可以在编译
(11)向当前工程添加存放源文件的子目录
- 向当前工程添加存放源文件的子目录,目录可以是绝对路径或相对路径
(12)在目录下查找所有源文件
(13)打印输出信息
- 打印输出信息,mode包括FATAL_ERROR、WARNING、STATUS、DEBUG等
- message(STATUS “Set debug mode")
PROJECT_NAME:项目名称,与project( xxx) 一致
PROJECT_SOURCE_DIR:即内含 project() 指令的 CMakeLists 所在的文件夹
EXECUTABLE_OUTPUT_PATH:可执行文件输出路径
LIBRARY_OUTPUT_PATH :库文件输出路径
CMAKE_BINARY_DIR:默认是build文件夹所在的绝对路径
CMAKE_SOURCE_DIR:源文件所在的绝对路径
(14)搜索外部库
- 功能:采用两种模式( FindXXX.cmake和XXXConfig.cmake )搜索外部库
- 示例:find_package( OpenCV 3.4 REQUIRED )
- version:指定查找库的版本号。EXACT:要求该版本号必须精确匹配。QUIET:禁掉没有找到时的警告信息。REQUIRED选项表示如果包没有找到的话,CMake的过程会终止,并输出警告信息。
搜索有两种模式
- Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成。
- Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件从而找到XXX库。其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。
两种模式看起来似乎差不多,不过cmake默认采取Module模式,如果Module模式未找到库,才会采取Config模式。
如果XXX_DIR路径下找不到XXXConfig.cmake文件,则会找/usr/local/lib/cmake/XXX/中的XXXConfig.cmake文件。总之,Config模式是一个备选策略。通常,库安装时会拷贝一份XXXConfig.cmake到系统目录中,因此在没有显式指定搜索路径时也可以顺利找到。
若XXX安装时没有安装到系统目录,则无法自动找到XXXConfig.cmake,需要在CMakeLists.txt最前面添加XXX的搜索路径。
(15)列表操作
- ENGTH:回list的长度
- GET:返回list中index的element到value中
- APPEND:添加新element到list中
- FIND:返回list中element的index,没有找到返回-1
- INSERT:将新element插入到list中index的位置
- REMOVE_ITEM:从list中删除某个element
- REMOVE_AT:从list中删除指定index的element
- REMOVE_DUPLICATES:从list中删除重复的element
- REVERSE:将list的内容反转
- SORT:将list按字母顺序排序
5.3 静态库和共享库
(1)静态库
原理:在编译时将源代码复制到程序中,运行时不用库文件依旧可以运行。
优点:运行已有代码,运行时不用再用库;无需加载库,运行更快
缺点:占用更多的空间和磁盘;静态库升级,需要重新编译程序
(2)共享库(常用)
原理:编译时仅仅是记录用哪一个库里面的哪一个符号,不复制相关代码
优点:不复制代码,占用空间小;多个程序可以同时调用一个库;升级方便,无需重新编译
缺点:程序运行需要加载库,耗费一定时间
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/do-yfwjc/71055.html