首页 文章

cmake库链接顺序

提问于
浏览
3

我有以下库lib_A,lib_B,lib_C,lib_D . 我在我的cmake文件中做了类似的事情(顺序很重要):

  • ADD_LIBRARY(lib_A)

  • ADD_LIBRARY(lib_B)

  • ADD_LIBRARY(lib_C)

  • ADD_LIBRARY(lib_D)

  • TARGET_LINK_LIBRARIES(lib_B lib_C)

  • TARGET_LINK_LIBRARIES(lib_A lib_B)

  • ADD_EXECUTABLE(Exec)

  • TARGET_LINK_LIBRARIES(exec lib_A)

  • TARGET_LINK_LIBRARIES(exec lib_D)

这导致以下链接器命令 .

链接器-llib_A -llib_D -llib_B -llib_C

Q1 . 为什么lib_B和lib_C在lib_D之后?

Q2 . 当我稍微更改cmake并执行以下操作时:

8_ TARGET_LINK_LIBRARIES(lib_A lib_D)9_ TARGET_LINK_LIBRARIES(exec lib_A)

然后链接顺序就像这个链接器-llib_A -llib_B -llib_C -llib_D这里,lib_B和lib_C在lib_D之前 . 这意味着target_link_libraries对可执行目标和库目标的工作方式不同 . 我对吗?

这里的问题是lib_B和lib_C也依赖于lib_D但是我不想创建target_link_libraries(lib_B lib_D)和target_link_libraries(lib_C lib_D),因为我有更多这样的情况,我必须手动为每个库做 . 当然在第二季做的事情解决了问题,但Q3 - cmake以某种方式保证这个顺序还是只是偶然?

谢谢

1 回答

  • 0

    只需将lib_B和lib_C链接到libD,这是值得的(我可以通过经验告诉),否则你将遇到很大的麻烦,例如,如果你试图安装你的程序 . 在完成创建库文件之前,lib_C和lib_D应该解决所有符号,然后再将它们链接到任何其他库 .

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

    TARGET_LINK_LIBRARIES(exec lib_A lib_D)
    

    并且,如果exec不直接依赖于lib_D,则可以避免在将lib_A正确链接到lib_D时将其链接起来 .

    无论如何,关于Q1:即使订单是由CMake保证的,也不保证你的链接器会如何对待它,如果你依赖它,你将会遭受痛苦

相关问题