2013-07-17 85 views
3

我有以下库lib_A,lib_B,lib_C,lib_D。我在做类似的东西在我的cmake文件(顺序很重要):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)

这导致下面的链接器命令。

连接-llib_A -llib_D -llib_B -llib_C

Q1。为什么lib_B和lib_C在lib_D之后? Q2302。当我改变CMake的一点点,做这样的事情:

8_1 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),因为我有更多这种情况,我必须这样做手动为每个库。 当然,像第二季度一样解决问题,但是 第三季度是否这个顺序通过cmake以某种方式保证,或者它只是一个偶然?

谢谢

+0

不知道的遭受疼痛ex和lib之间的顺序不同,但如果B和C都依赖于D,则应该真正指定它。 – Fraser

+0

问题是B和C在逻辑上是平台独立A的一部分,而整体依赖于平台lib D.我知道我应该这样做,但我有很多这样做,并且手动完成它将做出很多努力来维护它并提供一些自动解决方案会增加基于cmake的构建系统的复杂性。另一个问题是,当我将这个D依赖项明确地设置为每个平台独立的lib时,将导致D将被列在链接器列表上很多次。 – user2301299

+0

我有与外部库相同的问题 - 例如提升。我想避免在每个库中设置依赖关系。 – user2301299

回答

0

只是链接lib_B和lib_C到LIBD,这是值得的(我可以告诉的经验),否则就会有大麻烦,例如,如果您尝试安装程序。在链接到任何其他库之前,lib_C和lib_D应该在完成创建库文件时解决所有符号。

顺便说一句,你可以压缩你的每个目标target_link_libraries在一个线,如:

TARGET_LINK_LIBRARIES(exec lib_A lib_D) 

而且,如果执行不会对lib_D直接依赖,你能避免链接,如果你有正确链接lib_A到lib_D。

无论如何,对于Q1:即使订单是由CMake的保证,不保证该方式你的连接将对待它,你会如果你依赖于

+0

谢谢你的答案。我决定自动将依赖关系添加到每个库中。它将解决另一个问题。其中一些库在许多可执行文件之间共享。保持每个库级别的依赖关系,在连接这些可执行文件时,我不必担心未解决的符号。 – user2301299