如何防止意外包括旧标题?

时间:2014-01-31 21:04:08

标签: c++ build cmake header-files include-path

构建系统经常有单独的构建和安装步骤。有时,已安装的版本将在操作系统上安装较旧的标头,并且可能会拾取这些标头而不是源代码中的标头。这可能会导致源代码中非常微妙和奇怪的行为难以诊断,因为代码看起来像是做了一件事而二进制做了另一件事。

特别是,我的小组使用CMake和C ++,但这个问题也更广泛地相关。

是否有很好的技巧可以防止在构建中拾取旧标头?

2 个答案:

答案 0 :(得分:1)

1。卸载

在黑客开发版本时从CMAKE_INSTALL_PREFIX卸载软件包。

  • 优点:非常有效
  • 缺点:不灵活

2。自定义安装位置

使用自定义位置来安装目标,不要添加自定义安装前缀来构建。

  • 优点:非常灵活
  • 缺点:如果每个包都使用这种技术传递了大量的-I选项 编译器和大量<PACKAGE>_ROOT到cmake配置步骤。

3。包括优先级

使用标题搜索优先级。请参阅include_directories命令和 AFTER / BEFORE子选项。

  • 优点:足够灵活
  • 缺点:如果你有很多find_package / add_subdirectory,有时它不是一项微不足道的任务 命令,容易出错,自动测试未检测到错误。

顺便说一句

冲突不仅可以在构建/安装目录之间发生,还可以发生 在安装目录本身。例如版本1.0安装:A.hppB.hpp, 版本2.0安装:A.hpp。如果您按顺序安装1.02.0目标 本地不会检测到一些#include<B.hpp>错误。这种错误很容易 通过自动测试检测到(CI服务器的干净环境不具有B.hpp版本中的旧1.0文件)。卸载命令也很有帮助。

答案 1 :(得分:0)

Guys最近修复了shogun包的完全相同的问题。您基本上需要在系统文件夹之前将源文件夹(包括由-I传递到gcc的头文件。无论如何,您都不必将系统文件夹作为-I传递给gcc

查看搜索路径here。您可能需要在源代码中包含头文件的正确方法。

This是解决我猜测问题的拉取请求。