gpt4 book ai didi

gcc - CMake 库链接顺序

转载 作者:行者123 更新时间:2023-12-02 06:05:36 25 4
gpt4 key购买 nike

我有以下库lib_Alib_Blib_Clib_D。我正在我的 CMake 文件中执行类似的操作(顺序很重要):

  1. ADD_LIBRARY(lib_A)
  2. ADD_LIBRARY(lib_B)
  3. ADD_LIBRARY(lib_C)
  4. ADD_LIBRARY(lib_D)
  5. TARGET_LINK_LIBRARIES(lib_B lib_C)
  6. TARGET_LINK_LIBRARIES(lib_A lib_B)
  7. ADD_EXECUTABLE(执行)
  8. TARGET_LINK_LIBRARIES(执行 lib_A)
  9. TARGET_LINK_LIBRARIES(执行 lib_D)

这会产生以下链接器命令。

linker -llib_A -llib_D -llib_B -llib_C

Q1。为什么lib_Blib_Clib_D之后?

第二季度。当我稍微改变 CMake 并执行如下操作时:

  • TARGET_LINK_LIBRARIES(lib_A lib_D)
  • TARGET_LINK_LIBRARIES(执行 lib_A)
  • 那么链接顺序是这样的:

    linker -llib_A -llib_B -llib_C -llib_D

    这里,lib_Blib_C 位于 lib_D 之前。这意味着 target_link_libraries 对于可执行目标和库目标的工作方式不同。我说得对吗?

    这里的问题是 lib_Blib_C 也依赖于 lib_D,但我不想使 target_link_libraries( lib_B lib_D)target_link_libraries(lib_C lib_D),因为我有更多这样的情况,而且我必须为每个库手动执行此操作。当然,像第二季度一样解决了问题,但是:

    Q3 - 这个订单是由 CMake 以某种方式保证的还是只是偶然的?

    谢谢

    最佳答案

    只需将lib_Blib_C链接到lib_D,这是值得的(我可以根据经验判断),否则你会有大麻烦,例如,如果您尝试安装您的程序。当您完成创建库文件后,lib_Clib_D 应该先解析它们的所有符号,然后再将它们链接到任何其他库。

    顺便说一句,您可以将每个目标的 target_link_libraries 压缩为一行,例如:

    TARGET_LINK_LIBRARIES(exec lib_A lib_D)

    而且,如果 exec 不直接依赖于 lib_D,并且已将 lib_A 正确链接到 lib_D,则可以避免链接它。

    无论如何,关于 Q1:即使 CMake 保证了顺序,也不能保证你的链接器处理它的方式,如果你依赖它,你将会遭受痛苦

    关于gcc - CMake 库链接顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17711622/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com