back

C++ 胡言乱语X3

子标题:一个第三方库需要哪些构建选项。

C Runtime

  • 在 Linux 下编译,基本都是动态链接 glibc 吧,如果你想静态链接,或者静态链接其他 libc (如 musl)。
  • 在 Windows 下,通常都是链接 UCRT,那问题来了,应该有个选项选择 MT/MTd/MD/MDd 吧。

生成动态/静态库

这貌似是一个很基础的选项,没必要提出来,但事实上还是有很多开发者根本不处理(也许别人没考虑过 Windows 平台)。

比如在编译静态库时用了 #define EXPORT __declspec(dllexport),但根本不需要这玩意。

对编译不负责任就算了,实在偷懒可以用构建系统自带的导出符号

测试/例子

一个库总会有测试和例子,那问题来了,你不提供选项,内部也没处理,编译的时候还得顺带编译这一坨东西,但我最终只是想用 bin/lib/include 作为开发而已。

依赖管理

现在的项目管理外部依赖,通常考虑集成第三方库源码在项目里或者通过包管理下载(vcpkg/conan/CPM/FetchContent etc…)。

应该有一些构建选项可以让用户选择,自行下载依赖库还是使用集成在项目里的源码。但也有例外,有些项目的 cmakelists 里没有相关逻辑去选择,会直接用 CPM/FetchContent 下载依赖,直接打满硬盘空间,这就很可怕。不过这点可以通过加硬盘处理。

但要命的是,有时候会出现几个依赖库,本身也依赖了同一个库的情况,项目在编译链接的时候大概率报错失败,因为违反了 odr 原则,符号冲突了。不过大部分包管理也很难解决级联依赖的冲突,所以还是要要自己手工处理依赖,而依赖库可以提供选择自行下载依赖选项就好了。

Address Sanitizer

现在编译器已经普及了这一技术,然而很多开发者根本不知道有这玩意,或者知道了但没去开启 asan 。除了自己代码开 asan,所依赖的库最好也开启 asan 编译效果才最佳,否则有机率会出现 “假阳性”。

未完待续