链接到CMake目标会产生什么影响

What can linking to a CMake target impact?

本文关键字:什么 影响 CMake 目标 链接      更新时间:2023-10-16

我今天遇到了一个有趣的问题。我正在尝试编译一个测试可执行文件并将其链接到Boost单元测试框架,我尝试了两种不同的方式。

  1. 使用-lboost_unit_test_framework直接链接到"boost_unit_test_framework"库的经典方法
  2. 链接到Boost::unit_test_frameworkCMake目标的现代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标头与您使用的其他标头发生冲突。您可以通过检查错误消息中的包含文件链来检测到这一点。