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

What can linking to a CMake target impact?

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

  1. link使用 -lboost_unit_test_framework
  2. 直接访问 "boost_unit_test_framework" 库的经典方法
  3. link 到 Boost::unit_test_framework CMake 目标的现代 CMake 方法。

有趣的是,当我直接 link 到库时,我的代码编译并且 link 没问题;然而,当我 link 到 CMake 目标时,我的代码甚至在进入 linking 阶段之前就无法编译!

我收到的错误与突然似乎找不到的头文件有关。这表明 linking 到 Boost::unit_test_framework 以某种方式弄乱了我的包含路径。

我知道 link 到 CMake 目标应该是更现代和首选的方法,但如果它会产生这种意想不到和无法解释的副作用,它似乎比 link 更糟糕直接去图书馆...

为什么 link 使用 CMake 目标会导致不再找到头文件?还有哪些其他类型的东西可以 linking 到 CMake 目标而不是 link 直接到库影响?


在这两种情况下,我都使用 target_link_libraries 到 link 到 boost 库。例如

target_link_libraries(mytest_exe
    testlib
    -lboost_unit_test_framework
)

target_link_libraries(mytest_exe
    testlib
    Boost::unit_test_framework
)

The fact that it is failing before linking means that the target_link_libraries command in CMake actually effects more than just linking. It is effecting the compilation as well.

是的,当您 link 使用库 target 而不是库 file[=21 时,确实会添加新的包含目录=].这就是为什么该方法被称为 "modern" 的原因 - 一个 target_link_libraries 调用可以完成使用库所需的所有事情(在您的情况下是 Boost)。

使用 "modern" 方法失败的原因可能是 "true" Boost headers 与您使用的其他 headers 冲突。您可以通过检查错误消息中的包含文件链来检测到这一点。