cmake库链接顺序

时间:2013-07-17 22:49:52

标签: gcc cmake

我有以下库lib_A,lib_B,lib_C,lib_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(EXEC)
  8. TARGET_LINK_LIBRARIES(exec lib_A)
  9. TARGET_LINK_LIBRARIES(exec lib_D)
  10. 这导致以下链接器命令。

    linker -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),因为我有更多这样的情况,我不得不手动完成为每个图书馆。 当然,像Q2那样解决问题但是 Q3 - 这个订单是由cmake以某种方式保证的,还是只是偶然?

    谢谢

1 个答案:

答案 0 :(得分:1)

只需将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保证的,也不能保证你的链接器会对待它的方式,如果你依赖它,你将会遭受痛苦