【发布时间】:2019-06-13 02:25:39
【问题描述】:
我今天遇到了一个有趣的问题。我正在尝试编译一个测试可执行文件并将其链接到 Boost 单元测试框架,并以两种不同的方式进行了尝试。
- 使用
-lboost_unit_test_framework直接链接到“boost_unit_test_framework”库的经典方法 - 链接到
Boost::unit_test_frameworkCMake 目标的现代 CMake 方法。
有趣的是,当我直接链接到库时,我的代码编译和链接正常;但是,当我链接到 CMake 目标时,我的代码甚至在进入链接阶段之前就无法编译!
我得到的错误与突然似乎无法再找到的头文件有关。这表明链接到 Boost::unit_test_framework 不知何故弄乱了我的包含路径。
我知道链接到 CMake 目标应该是更现代和更受欢迎的方法,但如果它会产生如此意想不到和无法解释的副作用,它似乎比直接链接到库更糟糕......
为什么链接 CMake 目标会导致找不到头文件?还有哪些其他类型的东西可以链接到 CMake 目标而不是直接链接到库影响?
在这两种情况下,我都使用target_link_libraries 链接到 boost 库。例如
target_link_libraries(mytest_exe
testlib
-lboost_unit_test_framework
)
或
target_link_libraries(mytest_exe
testlib
Boost::unit_test_framework
)
【问题讨论】:
-
“我的代码在进入链接阶段之前无法编译” - 请发布您的确切编译器错误。以及有关您正在使用的编译器(和版本)的信息。 minimal reproducible example 最好。
-
你的代码只能在链接之前编译失败,链接在编译之后;)
-
出于安全原因,我无法发布确切的编译器错误。但是,我可以声明它缺少在它使用的头文件之一中定义的内容。这应该是回答“什么可以链接到 CMake 目标影响?”的实际问题所需的所有信息。我不是在问为什么我的具体示例无法编译。我在问链接到 CMake 目标会产生什么影响。
-
@user463035818 在链接之前它失败的事实意味着 CMake 中的
target_link_libraries命令实际上不仅仅影响链接。它也在影响编译。我的问题是为什么target_link_libraries会影响编译?看起来不太直观。 -
如果您无法发布原始代码的确切消息,您应该准备一个minimal reproducible example,这是非机密的并且会重现问题
标签: c++ boost cmake linker include-path