当前位置:网站首页 > 云服务教程 > 正文

cmake教程详解原理(cmake 教程)



目录

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)共享库(常用)

        原理:编译时仅仅是记录用哪一个库里面的哪一个符号,不复制相关代码
        优点:不复制代码,占用空间小;多个程序可以同时调用一个库;升级方便,无需重新编译
        缺点:程序运行需要加载库,耗费一定时间

 
   

到此这篇cmake教程详解原理(cmake 教程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 华为模拟器使用教程(华为模拟器使用教程图片)2025-09-05 07:00:08
  • u盘制作系统盘教程(怎样制作u盘启动盘 重装系统)2025-09-05 07:00:08
  • xshell连接交换机console口(xshell连接交换机console口教程)2025-09-05 07:00:08
  • cmake教程pdf(cmake教程 多层目录)2025-09-05 07:00:08
  • 2258xt量产工具视频(2258xt量产教程)2025-09-05 07:00:08
  • cmake 中文教程(cmake使用教程)2025-09-05 07:00:08
  • 2258xt开卡教程(2258xt开卡设置)2025-09-05 07:00:08
  • Junit5教程(junit5官方文档)2025-09-05 07:00:08
  • cmake 中文教程(cmake documentation)2025-09-05 07:00:08
  • 跳转链接怎么制作视频(跳转链接怎么制作视频教程)2025-09-05 07:00:08
  • 全屏图片