🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
在做算法部署的过程中,我们一般都是用C++
开发,主要原因是C++
的高效性,而构建维护一个大型C++工程的过程中,如何管理不同子模块之间的依赖、外部依赖库、头文件和源文件如何隔离、编译的时候又该如何相互依赖这些问题,直接用Makefile实现是比较麻烦的。这个时候,CMake的优势就显现出来了,简洁的命令大大简化了项目构建过程,而且其跨平台特性也方便了不同部署平台间的迁移。这里我想把工作这一年来,在实践过程中学到的CMake用法做个总结。这里会参考一篇在知乎写的非常不错的文章,但这里我只记录我认为比较重要的部分,从来不会用到的功能不去深究,毕竟只是个工具,够用就行。
一、CMake构建编译原理概述
- 单个cpp文件可以通过gcc直接编译生成可执行文件,但当项目很大时,这种方式便不再适用,我们需要写Makefile或者CMake。
- CMake构建C++工程其实是充当一个生成Makefile的媒介,以往直接写Makefile也是可以的,但是当工程越来越复杂的时候,Makefile就不那么好写了,目前也不要求自己学会写Makefile了;
- cpp工程一般由头文件目录、源文件目录和第三方库目录三大块代码内容组成,CMake一般会在每个模块文件夹下都建立一个CMakelists.txt文件,而在最顶层的源文件目录下,会建立一个总的CMakelists.txt用于控制整个cmake流程,然后通过add_subdirectory()命令递归的访问每个模块目录执行cmake,最后在build目录下生成一个总的makefile用于编译源码。头文件目录存放最终SDK提供出去需要的头文件、以及一些需要源文件目录访问的接口类定义头文件,源文件下的代码存放实现类,大致如此。CMake中需要配置每个模块编译时头文件需要从哪里找、还有链接的时候库文件需要从哪里找。
- gcc编译生成的目标文件分为三类,可执行文件、动态库和静态库。其中可执行文件在链接过程中会链接一些系统c运行时库等,需保证可执行文件对应的源码中main函数是存在的,不然会链接失败。动态库和静态库可以朴素的理解为就是一系列的cpp文件打包而成的,cpp文件中会定义一些类和函数可供调用,此外还有一些全局变量。