保证大型软件编译成功与良好运行的关键在于多个相关软件包的协同与配合。由于软件包的开发者可能只是基于某个特定版本的依赖库做他自己的开发工作,所以在选择软件包的依赖库版本时,不一定最新版的就是最好的。合理的做法是,首先在软件包的说明文档中寻找,看是否有对于依赖库版本号的明确说明。若没有,则可能需要经过编译与测试多个版本后,才能得出结论。接下来,就可以基于这些编译好的工具,开发自己的应用了。

随着时间的推移,自己的应用程序不断发展、演进,而其所依赖的第三方软件包与函数库也会逐步向前迭代。这就需要对它们定期更新,并重新按上述方法确定保证各组件能够正确协同工作的版本。

同时编译、测试、对比多个版本的软件包需要高度专注、极其小心,通过对如下条目多次检验核对,以保证生成的库或可执行文件正是自己想要的版本,测试程序亦严格在自己期望的参数条件下运行。这包括:

  • CMake 构建参数
  • 编译器参数
  • 编译生成的二进制文件的时间戳、文件名
  • 编译生成的二进制文件实际链接的库(可使用 ldd 命令查看)
  • 编译生成的二进制文件包含的符号名(可使用 nm 与 c++filt 命令查看)
  • 测试样例的输入参数
  • 输入文件与路径
  • 输出文件与路径
  • 当前工作目录
  • 环境变量

在配置编译可选组件时,秉持最小化原则,即暂时不需要的功能不选择。这样既方便排查版本不兼容问题,也缩短了编译时间和后期调试自己程序的时间。