Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接到CMake目标会产生什么影响?_C++_Boost_Cmake_Linker_Include Path - Fatal编程技术网

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

C++ 链接到CMake目标会产生什么影响?,c++,boost,cmake,linker,include-path,C++,Boost,Cmake,Linker,Include Path,我今天遇到了一个有趣的问题。我正在尝试编译一个测试可执行文件并将其链接到Boost单元测试框架,我尝试了两种不同的方法 使用-lboost\u unit\u test\u framework 链接到Boost::unit\u test\u框架的现代CMake方法CMake目标 有趣的是,当我直接链接到库时,我的代码编译和链接都很好;然而,当我链接到CMake目标时,我的代码甚至在到达链接阶段之前都无法编译 我得到的错误与一个头文件有关,而这个头文件似乎突然找不到了。这表明链接到Boost::un

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

  • 使用
    -lboost\u unit\u test\u framework
  • 链接到
    Boost::unit\u test\u框架的现代CMake方法
    CMake目标

  • 有趣的是,当我直接链接到库时,我的代码编译和链接都很好;然而,当我链接到CMake目标时,我的代码甚至在到达链接阶段之前都无法编译

    我得到的错误与一个头文件有关,而这个头文件似乎突然找不到了。这表明链接到
    Boost::unit_test_框架
    会以某种方式弄乱我的include路径

    我知道链接到CMake目标应该是更现代和更受欢迎的方法,但如果它会产生如此意想不到和无法解释的副作用,那么它似乎比直接链接到库更糟糕

    为什么链接CMake目标会导致无法再找到头文件?还有什么其他类型的东西可以链接到CMake目标而不是直接链接到库影响


    在这两种情况下,我都使用
    target\u link\u库
    链接到boost库。比如说

    target_link_libraries(mytest_exe
        testlib
        -lboost_unit_test_framework
    )
    

    它在链接之前失败的事实意味着CMake中的
    target\u link\u libraries
    命令实际上不仅仅影响链接。这也影响了汇编工作

    是的,当您链接库目标而不是库文件时,确实会添加新的include目录。这就是为什么这种方法被称为“现代”——单个
    target\u link\u libraries
    调用完成了使用库所需的所有事情(在您的例子中是Boost)


    “现代”方法失败的原因可能是“真实”的Boost头与您使用的其他头冲突。您可以通过检查错误消息中的include文件链来检测。

    “我的代码在到达链接阶段之前无法编译”-请发布确切的编译器错误。以及有关您正在使用的编译器(和版本)的信息。A最好。您的代码只能在链接之前编译失败,链接在编译之后;)出于安全原因,我无法发布确切的编译器错误。但是,我可以声明它缺少在它使用的一个头文件中定义的内容。这应该是回答“什么可以链接到CMake目标影响?”这一实际问题所需的全部信息。我不是问为什么我的特定示例无法编译。我在问链接到CMake目标会有什么影响。@user463035818链接之前失败的事实意味着CMake中的
    target\u link\u libraries
    命令实际上影响的不仅仅是链接。这也影响了汇编工作。我的问题是为什么
    target\u link\u库
    会影响编译?这似乎并不直观。如果你不能发布原始代码的确切信息,你应该准备一份非机密的文件,并重新说明问题谢谢@Tsyvarev,奇怪的是,没有一个错误提到任何boost头文件,甚至在调用
    target\u link\u库之前和之后打印include路径列表
    也会生成相同的路径列表。现在我仍然不确定它修改了什么,但我会继续朝这个方向看。嗯,我不确定,但是
    unit\u test\u framework
    不仅可以添加include目录,还可以编译定义。(与目标链接几乎可以修改任何编译器选项)。实际上,您可以比较这两种情况下的编译器命令行,以查看差异。好主意!我将在这两种情况下运行make VERBOSE=1并区分输出,以查看哪些标志和编译器选项可能与之不同!确实,它正在修改包含路径,它将其中一个路径移动到包含路径列表的后面。这本不应该是一个问题,但一些笨蛋决定在我们所有代码使用的主CMake脚本中加入
    include_目录(“.”
    )。这导致我的当前目录被视为“系统”目录。这意味着,
    #include
    在我自己的项目中查找了
    someheader.h
    ,并在它应该只在系统头文件中查找它时将其拉入。。。
    target_link_libraries(mytest_exe
        testlib
        Boost::unit_test_framework
    )