我有以下库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)
这导致以下链接器命令。
linker -llib_A -llib_D -llib_B -llib_C
Q1。为什么是lib_B
和lib_C
之后lib_D
?
Q2。当我稍微更改 CMake 并执行以下操作时:
TARGET_LINK_LIBRARIES(lib_A lib_D)
TARGET_LINK_LIBRARIES(exec lib_A)
那么链接顺序是这样的:
linker -llib_A -llib_B -llib_C -llib_D
这里lib_B
和lib_C
之前lib_D
。这意味着target_link_libraries
可执行目标和库目标的工作方式不同。我对吗?
这里的问题是lib_B
andlib_C
也取决于lib_D
,但我不想制作target_link_libraries(lib_B lib_D)
and target_link_libraries(lib_C lib_D)
,因为我有更多这样的情况,我必须为每个库手动完成。当然,在第二季度这样做可以解决问题,但是:
Q3 - 这个订单是由 CMake 以某种方式保证的还是只是偶然?
谢谢