代码之家  ›  专栏  ›  技术社区  ›  tjwrona1992

什么可以链接到CMAKE目标影响?

  •  -1
  • tjwrona1992  · 技术社区  · 5 年前

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

    1. 直接链接到“Boost单元测试框架”库的经典方法 -lboost_unit_test_framework
    2. 连接到 Boost::unit_test_framework 制作目标。

    有趣的是,当我直接链接到库时,我的代码会编译并链接良好;但是当我链接到cmake目标时,我的代码甚至在到达链接阶段之前都无法编译!

    我得到的错误与一个头文件有关,它突然找不到了。这表明链接到 Boost::单元测试框架 不知怎么搞砸了我的include路径。

    我知道链接到一个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
    )
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   Tsyvarev    5 年前

    在链接之前失败的事实意味着 target_link_libraries 实际上,cmake中的命令效果不仅仅是链接。它也在影响编译。

    是的,与库链接时确实添加了新的包含目录 目标 而不是图书馆 文件 . 这就是为什么这种方法被称为“现代”——一种单一的 目标链接库 call可以完成使用库所需的所有操作(在您的情况下是boost)。

    “现代”方法失败的原因可能是“真正的”助推头 冲突 使用其他头文件。您可以通过检查错误消息中的包含文件链来检测到这一点。