《CMake 构建实战-项目开发卷》阅读分享4—构建初探
<div class='showpostmsg'><div><div> </div>
<h1>杂谈</h1>
<div>CMaker 初学者容易犯的一个迷糊就是:CMake 调用编译工具链生成可执行文件。其实并不是这样的,在构建流程中,CMake 读取 CMakeLists.txt 文件生成 Makefile 或者 Visual Studio 工程或者其他构建工具的配置文件,通过它们来实际调用各种命令完成构建。</div>
<div>CMake 最常用的命令有如下两条</div>
<div>第一条命令,根据生成器生成配置文件,这里指定生成器为 Unix Makefiles</div>
<div>cmake -S . -B build -G “Unix Makefiles”</div>
<div>此命令运行结束会在 build/ 目录下生成 Makefile 文件,以及 CMakeCache.txt 文件。</div>
<div>第二条命令,进入 build/ 目录并开始编译,注意并不是 CMake 调用编译工具而是CMake在 build/ 目录根据指定的生成器,由对应的构建工具调用工具链开始编译。</div>
<div>cmake –build build</div>
<div>此命令并不是由 CMake 来调用编译工具执行编译,而是由 make 处理 Makefile 进而调用编译工具开始编译。</div>
<div>总而言之,CMake 本身并不实际调用编译器和链接器,而是根据整个构建流程,生成 Makefile 或者其他构建工具的配置文件,通过它们来实际调用各种命令完成构建,因此 CMake 常被称为构建系统生成器。</div>
<h1>CMake 项目的生命周期</h1>
<div>CMake 构建系统生成器在构建项目的过程中涉及到两个重要的阶段:一是执行 CMake 目录程序的阶段,二是根据程序执行结果生成构建系统配置文件的阶段。</div>
<div></div>
<div>命令行输入 cmake –help 可以查看当前 CMake 可执行程序支持的系统生成器,如下图所示:</div>
<div></div>
<h2>构建模式</h2>
<div>不同的构建模式分别对应一系列不同的预制编译链接选项。CMake 默认提供了如下四种构建模式:</div>
<ul>
<li>Debug 调试模式,禁用代码优化,便于调试;</li>
<li>Release 发布模式,启用代码优化并针对速度优化,启用内联并丢失调试符号,几乎无法调试;</li>
<li>RelWithDebInfo 发布调试模式,启用代码优化,但保留符号且不会内联函数,仍可调试;</li>
<li>MinSizeRel 最小体积发布模式,启用代码优化,但针对二进制体积进行优化,使其尽可能小;</li>
</ul>
<h2>使用命令行根据不同构建模式编译</h2>
<div>针对同一份代码用两种构建模式进行构建:Debug 和 Release 模式</div>
<div>进入 mylib 目录,先创建两个目录 build-debug 和 build-release 目录,分别进入两个目录,一个通过命令行传输 -DCMAKE_BUILD_TYPE=Debug 一个传入 -DCMAKE_BUILD_TYPE=Release</div>
<div>在 build-debug 目录:</div>
<div># 设置构建模式为 Debug 模式</div>
<div>cmake -DCMAKE_BUILD_TYPE=Debug ..</div>
<div></div>
<div># 开始编译</div>
<div>cmake –build . –config=Debug</div>
<div></div>
<div>在 build-release 目录</div>
<div>输入命令 cmake -DCMAKE_BUILD_TYPE=Release .. 生成配置文件</div>
<div></div>
<div>输入命令 cmake --build . –config=Release 开始构建</div>
<div></div>
<h2>安装和打包</h2>
<div>略过,嵌入式MCU 开发,一般都不需要安装和打包,因为库文件和可执行文件都在同一个SDK中。如果有外部一来,一般是拷贝到同一个SDK中。</div>
<h1>CMake 命令行的使用</h1>
<h2>命令行:配置和生成</h2>
<div>为了配置一个CMake 项目并为其生成构建系统的配置文件,涉及到以下三个参数:</div>
<ul>
<li>源文件目录,是项目的入口,应当包含一个 CMakeLists.txt 文件作为顶层入口;</li>
<li>构建目录:又称为二进制目录,一般与源文件不同;</li>
<li>生成器:即构建系统生成器,可以是 Makefile/Visual Studio 等生成器;</li>
</ul>
<div>有三种调用形式:</div>
<div>cmake [<其他选项>…] <源文件目录></div>
<div>cmake [<其他选项>…] <已存在的构建目录></div>
<div>cmake [<其他选项>…] -S <源文件目录> -B <构建目录></div>
<h2>命令行:构建</h2>
<div>完整形式为:</div>
<div>cmake –build <构建目录> [<选项>…] [-- <传递给构建系统的选项>…]</div>
<div>构建时的常用选项</div>
<div>--parallel [<并行数量>] 等同于 -j [<并行数量>]</div>
<div>用来指定构建项目的最大并行进程数量。</div>
<div>--target <目标名称>… 等同于 -t <目标名称>…</div>
<div>用于构建 <目标名称> 参数指定的若干个目标,多个 <目标名称> 参数用空格隔开。如果省略这个参数,默认构建全部。</div>
<div>--clean-first</div>
<div>要求构建系统在构建目标之前先清理项目生成的文件,即执行 clean 指令构建目标。</div>
<div>--verbose 等同于 -v</div>
<div>此参数用于开启详细的构建日志输出,一般会包含构建的每一步执行的命令行。</div>
<div> </div>
<!--importdoc--></div>
<p><!--importdoc--></p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>学习了,谢谢楼主的实战分享,《CMake 构建实战-项目开发卷》</p>
<p>谢谢分享,期待后续,cmake一直只会简单用用,希望接这个机会和大家深入了解一下cmake</p>
页:
[1]