分享一个适合【团队】开发的cmake【跨平台】工程模板
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。
目录
- 文件目录说明
- 操作:Linux系统下编译
- 编译动态库
- 编译、运行可执行文件
- Windows系统中使用VSCode开发
- 创建MSVC工程
- 执行cmake配置
- 编译动态库
- 编译、运行可执行程序
- Windows只用VS2019来开发
- 生成VS2019解决方案
- 使用VS2019编译动态库
- 编译、运行可执行程序
别人的经验,我们的阶梯!
之前分享过一篇关于 cmake 的入门文章:《使用 cmake 来搭建跨平台的应用程序框架:C语言版本》,那篇文章重点是描述如何利用 cmake 来编译或者构建跨平台的工程,并没有涉及到团队协作开发方面的内容。
这篇文章提供了一个简洁易懂的 cmake 工程模板,可以满足一个小团队的合作开发,无论是在代码安全性,还是开发效率上,都能满足基本的开发需求。
本文详细描述了文件结构和操作流程,如何在Linux
系统使用命令行来编译,如何在Windows
系统中使用VSCode
和Visual Studio 2019
来进行开发和编译。
使用这个cmake
模板之后,代码的结构非常的清晰,编译过程中产生的中间文件也不会污染源代码。
无论是开发一些个人项目,或者是在一些小团队中使用是绰绰有余了。
示例代码中核心的两个文件就是:app.cmake
和lib.cmake
,几乎每一行都有注释。
文末有下载链接。
文件目录说明
在团队开发工作中,每个人负责不同的模块。
从代码保密的角度看,除了项目负责人(或者说项目整合人员)有权限获取一个项目中的所有代码之外,每个开发者通常只拥有自己负责的模块。
每个开发者在编译自己的模块时,需要把输出文件(头文件、库文件、文档)等,汇总到一个中央仓库中,方便整合人员进行集成编译。
因此,示例代码如下图所示:
CMakeLists.txt:是最外层的 cmake 文件; install:是所有模块编译结果的安装目录,便于项目整合人员集成编译; myapp:是一个可执行程序的模板; mymath:是一个动态链接库的模板;
再来看一下mymath
内部的文件组织结构:
build:存放编译过程中产生的中间文件,不会污染源代码。当然了,如果使用 git 来进行版本管理,需要把这个目录添加到 .gitignore 文件中; lib.cmake:比较重要的 cmake 文件,这个模板的核心价值就在这个文件中; source:存放源代码,并且区分了 linux 和 windows 系统,在不同的系统上编译,会自动编译对应目录下的 C 文件; include:存放头文件;
myapp
目录内部结构与mymath
几乎是一样的,这里就不赘述了。
这两个模块的编译结果会自动输出到install
目录,如下图所示:
在install
目录内:
include:汇总了所有模块的头文件; library:汇总了所有模块输出的库文件; bin:汇总了所有的可执行程序(一些单元测试程序根据自己的需要是否输出此目录);
【本文作者】公-众-号:“IOT物联网小镇”,是道哥在工作之余个人维护的分享平台,十多年的嵌入式开发老兵,专注于嵌入式 + Linux 领域,玩过单片机、搞过智能家居、研究过 PLC 和 工业机器人。厚积薄发、换位思考,以读者的角度来总结文章。每一篇输出,不仅仅是干货的呈现,更是引导你一步一步的深入思考,从底层逻辑来提升自己。
操作:Linux系统下编译
编译动态库
删除install
下所有文件和目录,得到一个干净的目录。
创建build
目录,存放中间文件:
$ cd demo_cmake\mymath
$ mkdir build
编译
$ cd build
$ cmake ..
$ make
成功编译后,在install
目录里可以看到编译的输出结果:
demo_cmake\install\include\mymath\mymath.h
demo_cmake\install\library\linux\debug\libmymath.so
编译可执行文件
$ cd demo_cmake\myapp
$ mkdir build
$ cd build
$ cmake ..
$ make
查看install
目录下的输出结果:
demo_cmake\install\bin\linux\debug\myapp
运行可执行程序
$ cd demo_cmake\install\bin\linux\debug
$ ./myapp
执行结果如下图:
Windows系统中使用VSCode开发
创建MSVC工程
在VSCode IDE
中,通过菜单【File】-【Open Folder】,打开文件夹demo_cmake
。
因为demo_cmake
目录下存在一个顶层CMakeLists.txt
文件,所以VSCode
侦测到之后会自动进行cmake
配置,同时会创建目录build
来存放所有的中间文件。
有些VSCode
版本会跳出一个提示窗,让用户选择进行cmake
配置,如下一步中所示。
执行cmake配置
可以同时按下:【ctrl】 + 【shift】 + 【p】,重新进行cmake
配置:
编译动态库
同时按下【shift】+【F7】,(或者按下VSCode
最下方 【Build】右侧的编译目标),弹出窗口:
查看install
目录中的输出文件:
demo_cmake\install\library\windows\debug\mymath.lib
demo_cmake\install\bin\windows\debug\mymath.dll
编译可执行程序
同时按下【shift】+【F7】,选择编译myapp。
查看install
目录:
demo_cmake\install\bin\windows\debug\myapp
双击运行可执行程序
Windows只用VS2019来开发
生成VS2019解决方案
打开命令行窗口: x64 Native Tools Command Prompt for VS 2019
> cd demo_cmake
> md build
> cd build
> cmake ..
输出如图:
使用VS2019编译动态库
此时,可以看到解决方案:demo_cmake\build\demo_cmake.sln
。
使用VS2019
打开解决方案文件:
在工程mymath
上单击右键,选择【重新生成】,在输出信息区可以看到生成了文件:
demo_cmake\install\library\windows\debug\mymath.lib
demo_cmake\install\bin\windows\debug\mymath.dll
编译可执行程序
在工程myapp
上单击右键,选择【重新生成】。
在输出信息区可以看到生成了文件:
demo_cmake\install\bin\windows\debug\myapp.exe
运行可执行程序
------ End ------
我们知道,在Windows
平台上,VS2019
只是一个IDE
而已,它的底层是调用MSBuild
来执行编译动作的。
MSBuild
的角色与cmake
非常类似,使用起来也比较方便,以后再总结一篇关于MSBuild
的模板工程。
既然看到这里了,如果觉得不错,请您随手点个【赞】和【在看】吧!
如果转载本文,文末务必注明:“转自微信公众号:IOT物联网小镇”。
相关文章
- ☕【Java深层系列】「并发编程系列」深入分析和研究MappedByteBuffer的实现原理和开发指南
- ☕【Java深层系列】「并发编程系列」让我们一起探索一下CompletionService的技术原理和使用指南
- ☕【Java深层系列】「并发编程系列」让我们一起探索一下CountDownLatch的技术原理和源码分析
- ☕【Java深层系列】「并发编程系列」让我们一起探索一下CyclicBarrier的技术原理和源码分析
- ☕【Java实战系列】「技术盲区」Double与Float的坑与解决办法以及BigDecimal的取而代之!
- ☕【Java深层系列】「技术盲区」让我们一起去挑战一下如何读取一个较大或者超大的文件数据!
- 【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南
- ☕【Java深层系列】「技术盲区」让我们一起完全吃透针对于时间和日期相关的API指南
- 🏆【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究
- ☕【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理
- 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路
- ☕【Java技术指南】「技术盲区」看看线程以及线程池的异常处理机制都有哪些?
- ☕【Java技术指南】「编译器专题」深入分析探究“静态编译器”(JAVA\IDEA\ECJ编译器)是否可以实现代码优化?
- ☕【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了!
- ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(原理及源码篇)
- Java技术开发专题系列之【Guava RateLimiter】针对于限流器的入门到精通(针对于源码分析介绍)
- ☕【Java技术指南】「并发编程专题」针对于Guava RateLimiter限流器的入门到精通(含实战开发技巧)
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【上部】
- ☕【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)