cmake教程推荐(cmake tutorial)

cmake教程推荐(cmake tutorial)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p> 

讯享网

纸上学来终觉浅,觉知此时要躬行。学习一项技术最好的武器就是去实践和复盘。接触cmake有一年多了,但是真正学会cmake也是在用cmake编译项目的过程中,逐渐掌握了这门技术。本文想带着读者从一个小的点开始逐渐完善,最后做出一个涵盖绝大部分功能和满足日常需求的cmake demo工程。作者将在github中新建一个新的仓库,然后逐渐向上提交代码。最后作者会开源本项目的github网址,读者可以自行根据commit版本提示找到每一部分的源码。

  • 安装cmake
    因为是构建demo不需要依赖复杂的包,只需要ubuntu apt库中cmake即可,如果要更高版本,请自行到官网下载。
讯享网

最基本的项目是将一个源代码文件生成可执行文件。对于这么简单的项目,只需要一个三行的 CMakeLists.txt 文件即可,这是本篇教程的起点。在 目录中创建一个 CMakeLists.txt 文件,如下所示:

 

cmake_minimum_required 指定使用 CMake 的最低版本号,project 指定项目名称,add_executable 用来生成可执行文件,需要指定生成可执行文件的名称和相关源文件。

注意,此示例在 CMakeLists.txt 文件中使用小写命令。CMake 支持大写、小写和混合大小写命令。tutorial.cpp 文件在commit first目录中,可用于计算数字的平方根。

讯享网
  • 构建 编译 运行
    先从命令行进入到 目录,并创建一个构建目录 build,接下来,进入 build 目录并运行 CMake 来配置项目,并生成构建系统:
 

可执行文件Tutorial就在build目录下。

讯享网

之前CMakeList.txt如下:

 

指定了项目名后,后面可能会有多个地方用到这个项目名,如果更改了这个名字,就要改多个地方,比较麻烦,那么可以使用 == PROJECT_NAME== 来表示项目名。

讯享网

生成可执行文件需要指定相关的源文件,如果有多个,那么就用空格隔开,比如:

 

我们也可以用一个变量来表示这多个源文件:

讯享网

set 命令指定 SRC_LIST 变量来表示多个源文件,用 ${var_name} 获取变量的值。
于是原来的 CMakeLists.txt 文件就可以变成如下所示:


讯享网

 

这样可配置性就增强了很多,有利于后续项目扩展。

  • 添加版本号和配置头文件

我们可以在 CMakeLists.txt 为可执行文件和项目提供一个版本号。首先,修改 CMakeLists.txt 文件,使用 project 命令设置项目名称和版本号。

讯享网

由于 TutorialConfig.h 文件会被自动写入 build 目录,因此必须将该目录添加到搜索头文件的路径列表中。将以下行添加到 CMakeLists.txt 文件的末尾:

 

安装刚才的方式用cmake … 构建项目的过程中会在build目录中生成TutorialConfig.h

讯享网

下一步在 tutorial.cpp 包含头文件 TutorialConfig.h,最后通过以下代码打印出可执行文件的名称和版本号。

 
  • 制定 c++标准

接下来将tutorial.cpp 源码中的 atof 替换为 std::stod,这是 C++11 的特性。

讯享网

在 CMake 中支持特定 C++标准的最简单方法是使用 CMAKE_CXX_STANDARD 标准变量。在 CMakeLists.txt 中设置 CMAKE_CXX_STANDARD 为11,CMAKE_CXX_STANDARD_REQUIRED 设置为True。确保在 add_executable 命令之前添加 CMAKE_CXX_STANDARD_REQUIRED 命令。

 

此时完整的CMakeList.txt

讯享网

根据刚才的方法编译运行

 

代码保存在github commit second版本中

讯享网

现在我们将向项目中添加一个库,这个库包含计算数字平方根的实现,可执行文件使用这个库,而不是编译器提供的标准平方根函数。
我们把库放在名为 MathFunctions 的子目录中。此目录包含头文件 MathFunctions.h 和源文件 mysqrt.cpp。源文件有一个名为 mysqrt 的函数,它提供了与编译器的 sqrt 函数类似的功能,MathFunctions.h 则是该函数的声明。
在 MathFunctions 目录下创建一个 CMakeLists.txt 文件,并添加以下一行:

 

为了使用== MathFunctions== 这个库,我们将在顶级 CMakeLists.txt 文件中添加一个 add_subdirectory(MathFunctions) 命令指定库所在子目录,该子目录下应包含 CMakeLists.txt 文件和代码文件。

可执行文件要使用库文件,需要能够找到库文件和对应的头文件,可以分别通过 target_link_librariestarget_include_directories 来指定。

使用 target_link_libraries 将新的库文件添加到可执行文件中,使用 target_include_directories 将 MathFunctions 添加为头文件目录,添加到 Tutorial 目标上,以便 mysqrt.h 可以被找到。
然后在测试文件中把函数名设置为mysqrt。

讯享网

完整的CMakeList.txt

 

安装刚才的方式编译运行,可以得到。

讯享网

代码在github仓库提交版本 commit third中

现在将 MathFunctions 库设为可选的,虽然对于本教程来说,功能已经完成了,但对于较大的项目来说,这种情况很常见。

第一步是向顶级 CMakeLists.txt 文件添加一个选项。

 

option 表示提供用户可以选择的选项。命令格式为:option( “description [initial value])。

==USE_MYMATH ==这个选项缺省值为 ON,用户可以更改这个值。此设置将存储在缓存中,以便用户不需要在每次构建项目时设置该值。

下一个更改是使 MathFunctions 库的构建和链接成为条件。于是创建一个 if 语句,该语句检查选项 USE_MYMATH 的值。
在 if 块中,有 add_subdirectory 命令和 list 命令,APPEND表示将元素MathFunctions追加到列表EXTRA_LIBS中,将元素 ${PROJECT_SOURCE_DIR}/MathFunctions 追加到列表EXTRA_INCLUDES中。EXTRA_LIBS 存储 MathFunctions 库,EXTRA_INCLUDES 存储 MathFunctions 头文件。
变量EXTRA_LIBS用来保存需要链接到可执行程序的可选库,变量EXTRA_INCLUDES用来保存可选的头文件搜索路径。这是处理可选组件的经典方法,我将在下一步介绍现代方法。
接下来对源代码的进行修改。首先,在 tutorial.cpp 中包含 MathFunctions.h 头文件,
然后,还在 tutorial.cpp 中,使用 USE_MYMATH 选择使用哪个平方根函数:

讯享网

因为源代码使用了 USE_MYMATH 宏,可以用下面的行添加到 tutorialconfig.h.in 文档中:

 

完整的CMakeLists如下:

讯享网

测试:

 

代码在commit four版本中

讯享网

到这里整个教程就结束了,教程源码在https://github.com/tongjiaxuan666/CmakeLearn
在这里插入图片描述

小讯
上一篇 2025-06-15 14:47
下一篇 2025-04-26 14:16

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/204806.html