
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 \({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(< dir > < variable >)
aux_source_directory(\({CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)</p><p>add_executable(app \){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] ...) </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] ...) </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(<static lib> [<static lib>…])
link_directories(<lib path>)
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 <stdio.h></span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__meta">#include <stdlib.h></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 < 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 < <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 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。对于上面的 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, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans CN", sans-serif, "Apple Color Emoji", "Segoe UI Emoji";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> 表示在上一级目录中查找 CMakeLists.txt 文件。</p></li><li><p><span style="color: rgb(255, 0, 0);">cmake . </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, "Andale Mono", "lucida console", "Courier New", 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})
第三步:在当前目录执行 cmake . ,
第一步:编写源代码,demo3文件夹下有一个文件main.c和一个文件夹math,math文件夹下有两个文件MathFunctions.c/MathFunctions.h
# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)# 项目信息project (Demo3)# 查找当前目录下的所有源文件# 并将名称保存到 DIR_SRCS 变量DIR_SRCS)# 添加 math 子目录add_subdirectory(math)# 指定生成目标main.cc)# 添加链接库MathFunctions)
讯享网
想了解更多
赶紧扫码关注
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/142223.html