我有一个 CMake 项目,其中包含并链接两个库,例如A
and B
(实际上它不止两个,其中之一是增强的东西,但这在这里并不重要)。两者都位于通过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) - 或同时驻留在两者中。比方说A
仅在$HOME/usr/include
and $HOME/usr/lib
while B
(在我的情况下提升)驻留在两个系统路径中(/usr/include
and /usr/lib
)并且在基于用户的路径中 - 在不同的版本中。可以使用查找脚本来查找系统或基于用户的库B
,这有效。
当我想要链接时,麻烦就开始了B
从系统路径。${B_INCLUDE_DIRS}
and ${B_LIBRARIES}
正确指向标头和库的系统范围位置。但还是有${A_INCLUDE_DIRS}
指向非系统包含目录,最终也指向库的标头B
是从这个位置获取的,而链接B
使用系统路径中的版本(通过${B_LIBRARIES}
)这会导致冲突,即链接错误。
改变顺序INCLUDE_DIRECTORIES
声明似乎并没有改变任何事情。我通过以下方式检查了导致链接错误的符号的来源nm --line-numbers
在目标文件上。
我能做些什么?有没有什么窍门
- 强制包含目录的顺序(即使这意味着优先考虑系统路径,尽管还指定了基于用户的位置)?
- 告诉 CMake 使用
${A_INCLUDE_DIRS}
对于来自的所有标头A
and ${B_INCLUDE_DIRS}
对于来自的所有标头B
?
这是 CMake 所说的include_directories()
:
include_directories([之后|之前] [系统] dir1 [dir2 ...])
您可以指定在您告诉系统包含目录时要在系统包含目录之前或之后搜索包含目录。
您还可以指定一个目标:
target_include_directories(目标 [系统] [之前] [items1...] [ [items2...] ...])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)