CMake:包含目录的排序(如何混合基于系统和用户的包含路径?)

新手上路,请多包涵

我有一个 CMake 项目,其中包含并链接两个库,比如 AB (实际上它不止两个,其中一个是 boost 的东西,但这不是这里真的很重要)。两者都通过 FindSomething.cmake 脚本(正确)填充标准 CMake 变量,例如通过添加包含目录

INCLUDE_DIRECTORIES(${A_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${B_INCLUDE_DIRS})

链接稍后通过

TARGET_LINK_LIBRARIES(mytarget ${A_LIBRARIES} ${B_LIBRARIES})

现在,问题是这两个库都可以驻留在基于用户的位置或系统目录中(顺便说一句,我在 linux 上,CMake 2.8.2) - 或两者兼而有之。 Let’s say A is only in $HOME/usr/include and $HOME/usr/lib while B (boost in my case) resides in both the system paths ( /usr/include/usr/lib )和基于用户的路径 - 在不同的版本。可以使用查找脚本来查找系统或基于用户的库 B ,这是可行的。

当我想从系统路径链接到 B 时,问题就开始了。 ${B_INCLUDE_DIRS}${B_LIBRARIES} 正确指向头文件和库的系统范围位置。但是仍然有 ${A_INCLUDE_DIRS} 指向一个非系统包含目录,最终还有库 B 的标题是从这个位置获取的,而 B 的链接 --- 使用系统路径中的版本(通过 ${B_LIBRARIES} ),这会导致冲突,即链接错误。

更改 INCLUDE_DIRECTORIES 语句的顺序似乎没有任何改变。我通过目标文件上的 nm --line-numbers 检查了导致链接错误的符号的来源。

我能做些什么?有没有诀窍

  • 强制包含目录的排序(即使这意味着优先考虑系统路径,尽管还指定了基于用户的位置)?
  • 告诉 CMake 使用 ${A_INCLUDE_DIRS} 来自 A ${B_INCLUDE_DIRS} 来自 B 的所有头文件

原文由 janitor048 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 303
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题