链接到 CMake 目标会产生什么影响?
What can linking to a CMake target impact?
我运行今天遇到了一个有趣的问题。我正在尝试编译 link 一个测试可执行文件到 Boost 单元测试框架,我用两种不同的方式进行了尝试。
- link使用
-lboost_unit_test_framework
直接访问 "boost_unit_test_framework" 库的经典方法
- 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 冲突。您可以通过检查错误消息中的包含文件链来检测到这一点。
我运行今天遇到了一个有趣的问题。我正在尝试编译 link 一个测试可执行文件到 Boost 单元测试框架,我用两种不同的方式进行了尝试。
- link使用
-lboost_unit_test_framework
直接访问 "boost_unit_test_framework" 库的经典方法
- 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 冲突。您可以通过检查错误消息中的包含文件链来检测到这一点。