我今天遇到了一个有趣的问题。我正在尝试编译一个测试可执行文件并将其链接到Boost单元测试框架,我尝试了两种不同的方式。
- 使用
-lboost_unit_test_framework
直接链接到"boost_unit_test_framework"库的经典方法 - 链接到
Boost::unit_test_framework
CMake目标的现代CMake方法
有趣的是,当我直接链接到库时,我的代码会编译并链接良好;然而,当我链接到CMake目标时,我的代码在进入链接阶段之前就无法编译!
我遇到的错误与它突然找不到的头文件有关。这表明链接到Boost::unit_test_framework
在某种程度上扰乱了我的include路径。
我知道链接到CMake目标应该是更现代、更受欢迎的方法,但如果它会产生如此意想不到和无法解释的副作用,那似乎比直接链接到库更糟糕。。。
为什么链接CMake目标会导致找不到头文件?还有哪些其他类型的东西可以链接到CMake目标而不是直接链接到库影响?
在这两种情况下,我都使用target_link_libraries
链接到提升库。例如
target_link_libraries(mytest_exe
testlib
-lboost_unit_test_framework
)
或
target_link_libraries(mytest_exe
testlib
Boost::unit_test_framework
)
链接之前失败的事实意味着CMake中的
target_link_libraries
命令实际上不仅仅是链接。它也在影响汇编。
是的,当您链接到库目标而不是库文件时,确实会添加新的包含目录。这就是为什么这种方法被称为"现代"的原因——一个target_link_libraries
调用可以完成使用库所需的所有事情(在您的情况下为Boost)。
"现代"方法失败的原因可能是"true"Boost标头与您使用的其他标头发生冲突。您可以通过检查错误消息中的包含文件链来检测到这一点。