4. 代码结构设计
大家好,我是程序喵。
上一篇文章我们已经梳理了整体的流程,这篇文章正式进行代码开发。
写代码之前,首先需要设计代码的整体结构,简单粗略来说就是建立不同的目录,不同目录放置不同模块的代码。
如图:

这里我建了几个目录,主要有:
- include:一般SDK的产物会是个静态库/动态库 + 对外头文件,SDK的对外头文件就会放在这个include目录。
- src:整个SDK的核心代码,甚至可以说几乎所有代码都放在此目录。
- examples:这个目录会放相关的示例代码,主要给用户查看SDK相关代码的使用示例。
- tests:这个目录会放置相关的测试代码,主要是放置单元测试的代码,项目中开发的大多数函数的功能,建议都加在单元测试中。
- scripts:脚本都放在此目录,这里主要放置相关的构建脚本。
先从一个简单的函数 BuriedTest() 来搭建整个框架。

先对外暴露一个 BuriedTest() 函数,函数的声明放置在include/buried.h中:
函数的定义放置在src/buried.cc中:
有了头文件 + 源文件,也有了函数的声明 + 定义,如何编译成动态库、静态库呢?
这里我们使用cmake构建,cmake构建需要搭配CMakeLists.txt,这个CMakeLists.txt也可以理解为是cmake的源文件。
cmake会通过CMakeLists.txt生成整体的makefile文件,然后再通过makefile文件编译整个项目。
在编写CMakeLists.txt之前,我想有必要先介绍下在Linux下如何使用命令行编译程序,这有助于我们理解CMakeLists.txt的语法。
一个基本的命令行编译示例:
它表示:
- clang++ a.cc 表示使用clang++编译源程序
- -I b 表示指定b目录为头文件的寻找目录
- -L c 表示指定c目录为链接库的寻找目录
- -l d 表示程序会链接libd.a
- -D EEE=HELLO 表示为整个程序定义一个宏EEE,为HELLO
- -o f.elf 表示生成的可执行文件名为f.elf
那CMakeLists.txt中对应的语句是什么呢?
- 编译源程序,可以使用add_executable 或 add_library,一个表示编译可执行文件,一个表示编译库文件
- 指定头文件的寻找目录,可以使用 include_directories
- 指定链接库的寻找目录,可以使用 link_directories
- 链接某个三方库,可以使用 target_link_libraries
- 定义宏,可以使用 add_definitions
介绍完核心的几个语句后,我这里贴下项目中整体的CMakeLists.txt,详见注释
再看下src中的CMakeLists.txt:
使用CMakeLists.txt定义好了构建规则后,就需要写编译脚本了,详见注释:
scripts/build.py:
整个脚本核心其实就两段:
- 生成makefile文件
- 构建
生成makefile文件的语句:
构建语句:
脚本写好之后,我们就可以编译程序了,比如
编译后我们尝试运行一下,结果如图:

从图中可以看到,咱的整个结构设计的流程已经正常跑通了。
本节具体代码详见:https://github.com/chengxumiaodaren/BuriedPoint/tree/0.1.1
下一节我会具体介绍项目中依赖的三方库,以及如何依赖三方库。下周见!
