我有以下库lib_A,lib_B,lib_C,lib_D。我在我的cmake文件中做了类似的事情(顺序很重要):
这导致以下链接器命令。
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以某种方式保证的,还是只是偶然?
谢谢
答案 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保证的,也不能保证你的链接器会对待它的方式,如果你依赖它,你将会遭受痛苦