7

我有以下库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)

这导致以下链接器命令。

linker -llib_A -llib_D -llib_B -llib_C

Q1。为什么是lib_Blib_C之后lib_D

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

  1. TARGET_LINK_LIBRARIES(lib_A lib_D)
  2. TARGET_LINK_LIBRARIES(exec lib_A)

那么链接顺序是这样的:

linker -llib_A -llib_B -llib_C -llib_D

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

这里的问题是lib_Bandlib_C也取决于lib_D,但我不想制作target_link_libraries(lib_B lib_D)and target_link_libraries(lib_C lib_D),因为我有更多这样的情况,我必须为每个库手动完成。当然,在第二季度这样做可以解决问题,但是:

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

谢谢

4

1 回答 1

2

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

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

TARGET_LINK_LIBRARIES(exec lib_A lib_D)

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

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

于 2013-07-18T06:12:38.260 回答