我有以下库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 回答
只需将lib_B和lib_C链接到libD,这是值得的(我可以通过经验告诉),否则你将遇到很大的麻烦,例如,如果你试图安装你的程序 . 在完成创建库文件之前,lib_C和lib_D应该解决所有符号,然后再将它们链接到任何其他库 .
顺便说一句,您可以在每个目标的一行中压缩
target_link_libraries
,例如:并且,如果exec不直接依赖于lib_D,则可以避免在将lib_A正确链接到lib_D时将其链接起来 .
无论如何,关于Q1:即使订单是由CMake保证的,也不保证你的链接器会如何对待它,如果你依赖它,你将会遭受痛苦