cmake 中文教程(cmake documentation)

cmake 中文教程(cmake documentation)nbsp 点击上方 机械电子工程技术 关注我们 CMake 是一个免费的多平台编译工具 旨在构建 测试和软件打包 CMake 是用于控制软件使用简单的平台和编译器编译过程独立配置文件 CMake 生成本机 makefile 和工作区 可以使用您所选择的编译器环境 通过编写 CMakeLists txt 可以控制生成的 Makefile 从而控制编译过程

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



 
点击上方“机械电子工程技术”关注我们




CMake是一个免费的多平台编译工具,旨在构建、测试和软件打包。CMake是用于控制软件使用简单的平台和编译器编译过程独立配置文件。CMake生成本机makefile和工作区,可以使用您所选择的编译器环境。
通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。
如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。


讯享网

1、宏功能

PROJECT_SOURCE_DIR

使用cmake命令后紧跟的目录,一般是工程的根目录

PROJECT_BINARY_DIR

执行cmake命令的目录

CMAKE_CURRENT_SOURCE_DIR

当前处理的CMakeLists.txt所在的路径

CMAKE_CURRENT_BINARY_DIR target 

编译目录

EXECUTABLE_OUTPUT_PATH

重新定义目标二进制可执行文件的存放位置

LIBRARY_OUTPUT_PATH

重新定义目标链接库文件的存放位置

PROJECT_NAME

返回通过PROJECT指令定义的项目名称

CMAKE_BINARY_DIR

项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径

2、常用命令

CMake 使用 # 进行行注释,可以放在任何位置。

CMake 使用 #[[ ]] 形式进行块注释。

指定使用的 cmake 的最低版本

cmake_minimum_required

定义工程会生成一个可执行程序

add_executable(可执行程序名 源文件名称)

指定使用的C++标准

set(CMAKE_CXX_STANDARD 11)

定义变量

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

set(SRC_LIST add.c  div.c   main.c  mult.c  sub.c)

set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c)

add_executable(app&nbsp; \({SRC_LIST})</p><p><strong>指定输出的路径</strong></p><p>set(HOME /home/robin/Linux/Sort)</p><p>set(EXECUTABLE_OUTPUT_PATH \){HOME}/bin)

查找某个路径下的所有源文件

aux_source_directory(&lt; dir &gt; &lt; variable &gt;)

aux_source_directory(\({CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)</p><p>add_executable(app&nbsp; \){SRC_LIST})

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)

file(GLOB MAIN_SRC \({CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)</span></p><p><span style="">file(GLOB MAIN_HEAD \){CMAKE_CURRENT_SOURCE_DIR}/include/*.h)

包含头文件

include_directories(headpath)

include_directories(\({PROJECT_SOURCE_DIR}/include)</span></p><p><strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;">制作静态库</span></strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;"></span></p><p><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;">add_library(库名称 STATIC 源文件1 [源文件2] ...)&nbsp;</span></p><p><strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;">制作动态库</span></strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;"></span></p><p><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;">add_library(库名称 SHARED 源文件1 [源文件2] ...)&nbsp;</span></p><p><strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;">指定静态库和动态库输出的路径</span></strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;"></span></p><p><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;">set(LIBRARY_OUTPUT_PATH \){PROJECT_SOURCE_DIR}/lib)

包含静态库文件

link_libraries(&lt;static lib&gt; [&lt;static lib&gt;…])

link_directories(&lt;lib path&gt;)

link_directories(\({PROJECT_SOURCE_DIR}/lib)</p><p>link_libraries(calc)</p><p><strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">包含动态</span><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">库文件</span></span></strong><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"></span></span></p><p>target_link_libraries(A B C)</p><p>target_link_libraries(D A)</p><p><br /></p><p>target_link_libraries(app pthread)</p><p><strong>宏定义</strong></p><p>add_definitions(-D宏名称)</p><p><span style="font-size: var(--articleFontsize);letter-spacing: 0.578px;"><br /></span></p><p><span style="font-size: 24px;"><strong>3、案例</strong></span></p><p><br /></p><p><strong>3.1单个源文件</strong><br /></p><section style="text-indent: 2em;"><strong>第一步:</strong>编写源代码,demo1文件夹下只有一个源文件main.c,内容如下:</section><section class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li></ul><pre class="code-snippet__js" data-lang="cs"><code><span class="code-snippet_outer"><span class="code-snippet__meta">#include &lt;stdio.h&gt;</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__meta">#include &lt;stdlib.h&gt;</span></span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment">/</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> * power - Calculate the power of number.</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> * @param base: Base value.</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> * @param exponent: Exponent value.</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> *</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> * @return base raised to the power exponent.</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> */</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__function"><span class="code-snippet__keyword">double</span> <span class="code-snippet__title">power</span>(<span class="code-snippet__params"><span class="code-snippet__keyword">double</span> <span class="code-snippet__keyword">base</span>, <span class="code-snippet__keyword">int</span> exponent</span>)</span></span></code><code><span class="code-snippet_outer">{</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">int</span> result = <span class="code-snippet__keyword">base</span>;</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">int</span> i;</span></code><code><span class="code-snippet_outer"> </span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">if</span> (exponent == <span class="code-snippet__number">0</span>) {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">1</span>;</span></code><code><span class="code-snippet_outer"> }</span></code><code><span class="code-snippet_outer"> </span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">for</span>(i = <span class="code-snippet__number">1</span>; i &lt; exponent; ++i){</span></code><code><span class="code-snippet_outer"> result = result * <span class="code-snippet__keyword">base</span>;</span></code><code><span class="code-snippet_outer"> }</span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">return</span> result;</span></code><code><span class="code-snippet_outer">}</span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__function"><span class="code-snippet__keyword">int</span> <span class="code-snippet__title">main</span>(<span class="code-snippet__params"><span class="code-snippet__keyword">int</span> argc, <span class="code-snippet__keyword">char</span> *argv[]</span>)</span></span></code><code><span class="code-snippet_outer">{</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">if</span> (argc &lt; <span class="code-snippet__number">3</span>){</span></code><code><span class="code-snippet_outer"> printf(<span class="code-snippet__string">"Usage: %s base exponent \n"</span>, argv[<span class="code-snippet__number">0</span>]);</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">1</span>;</span></code><code><span class="code-snippet_outer"> }</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">double</span> <span class="code-snippet__keyword">base</span> = atof(argv[<span class="code-snippet__number">1</span>]);</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">int</span> exponent = atoi(argv[<span class="code-snippet__number">2</span>]);</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">double</span> result = power(<span class="code-snippet__keyword">base</span>, exponent);</span></code><code><span class="code-snippet_outer"> printf(<span class="code-snippet__string">"%g ^ %d is %g\n"</span>, <span class="code-snippet__keyword">base</span>, exponent, result);</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span></code><code><span class="code-snippet_outer">}</span></code></pre></section><p style="text-indent: 2em;"><strong>第二步:</strong>编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下:</p><section class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li></ul><pre class="code-snippet__js" data-lang="properties"><code><span class="code-snippet_outer"><span class="code-snippet__comment"># CMake 最低版本号要求</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__attr">cmake_minimum_required</span> <span class="code-snippet__string">(VERSION 2.8)</span></span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 项目信息</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__attr">project</span> <span class="code-snippet__string">(Demo1)</span></span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 指定生成目标</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__meta">add_executable(Demo</span> <span class="code-snippet__string">main.cc)</span></span></code></pre></section><p data-pid="xUNRBmiZ"><br /></p><section style="text-indent: 2em;">CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号&nbsp;#&nbsp;后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。对于上面的 CMakeLists.txt 文件,依次出现了几个命令:</section><section style="text-indent: 2em;"><strong>cmake_minimum_required:</strong>指定运行此配置文件所需的 CMake 的最低版本;</section><section style="text-indent: 2em;"><strong>project:</strong>参数值是 Demo1,该命令表示项目的名称是 Demo1 。</section><section style="text-indent: 2em;"><strong>add_executable:</strong>将名为 main.cc 的源文件编译成一个名称为 Demo 的可执行文件。</section><section style="text-indent: 2em;"><strong>第三步:</strong>在当前目录执行 cmake . ,得到 Makefile 后再使用 make 命令编译得到 Demo1 可执行文件。</section><p><br /></p><p><strong>注意:</strong></p><ul style="padding-left: 32px;-webkit-font-smoothing: antialiased;list-style-position: outside;list-style-image: none;font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Ubuntu, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans CN&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;;margin-top: 14px;margin-bottom: 1em;font-size: 15px;line-height: 1.75;color: rgb(5, 7, 59);letter-spacing: normal;text-align: start;text-wrap: wrap;background-color: rgb(253, 253, 254);" class="list-paddingleft-1"><li><p><span style="color: rgb(255, 0, 0);">cmake ..</span>&nbsp;表示在上一级目录中查找 CMakeLists.txt 文件。</p></li><li><p><span style="color: rgb(255, 0, 0);">cmake .&nbsp;</span>表示在当前目录中查找 CMakeLists.txt 文件。</p><p><br /></p></li></ul><section><strong>3.2同一目录,多个源文件</strong></section><p style="text-indent: 2em;"><strong><span style="font-size: 16px;letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">第一步:</span></span></strong><span style="font-size: 16px;letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"></span><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">编写源代码,<span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">demo2文件夹下有三个文件,main.c/MathFunctions.c/MathFunctions.h</span></span></span><span style="background-color: inherit;font-family: Menlo, Monaco, Consolas, &quot;Andale Mono&quot;, &quot;lucida console&quot;, &quot;Courier New&quot;, monospace;font-size: inherit;color: rgb(25, 27, 31);letter-spacing: normal;text-align: start;"></span></p><p style="text-indent: 2em;"><strong><span style="font-size: 16px;letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">第二步:</span></span></span></strong><span style="font-size: 16px;letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"></span><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">编写 CMakeLists.txt 文件,<span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);">并保存在与 main.cc 源文件同个目录下:</span></span></span></span></p><section class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li></ul><pre class="code-snippet__js" data-lang="properties"><code><span class="code-snippet_outer"><span class="code-snippet__comment"># CMake 最低版本号要求</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__attr">cmake_minimum_required</span> <span class="code-snippet__string">(VERSION 2.8)</span></span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 项目信息</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__attr">project</span> <span class="code-snippet__string">(Demo2)</span></span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 指定生成目标</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__meta">add_executable(Demo</span> <span class="code-snippet__string">main.cc MathFunctions.cc)</span></span></code></pre></section><section><span style="font-size: 16px;letter-spacing: 0.578px;"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"><span style="letter-spacing: 0.578px;text-wrap: wrap;background-color: rgb(255, 255, 255);"></span></span></span></section><p style="text-indent: 2em;">查找指定目录下的所有源文件</p><section class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li></ul><pre class="code-snippet__js" data-lang="nginx"><code><span class="code-snippet_outer"><span class="code-snippet__comment"># CMake 最低版本号要求</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__attribute">cmake_minimum_required</span> (VERSION <span class="code-snippet__number">2</span>.<span class="code-snippet__number">8</span>)</span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 项目信息</span></span></code><code><span class="code-snippet_outer">project (Demo2)</span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 查找当前目录下的所有源文件</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 并将名称保存到 DIR_SRCS 变量</span></span></code><code><span class="code-snippet_outer">aux_source_directory(. DIR_SRCS)</span></code><code><span class="code-snippet_outer"><br /></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"># 指定生成目标</span></span></code><code><span class="code-snippet_outer">add_executable(Demo <span class="code-snippet__variable">\){DIR_SRCS})


第三步:在当前目录执行&nbsp;cmake .&nbsp;,

3.3多个目录,多个源文件

第一步:编写源代码,demo3文件夹下有一个文件main.c和一个文件夹math,math文件夹下有两个文件MathFunctions.c/MathFunctions.h

第二步:编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下:

# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)
# 项目信息project (Demo3)
# 查找当前目录下的所有源文件# 并将名称保存到 DIR_SRCS 变量aux_source_directory(. DIR_SRCS)
# 添加 math 子目录add_subdirectory(math)
# 指定生成目标 add_executable(Demo main.cc)
# 添加链接库target_link_libraries(Demo MathFunctions)

讯享网
第三步:在当前目录执行&nbsp;cmake .&nbsp;,
参考文献
1、https://subingwen.cn/cmake/CMake-primer/
&nbsp; &nbsp; &nbsp; &nbsp;

想了解更多

赶紧扫码关注

小讯
上一篇 2025-05-31 10:59
下一篇 2025-05-01 21:47

相关推荐

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