Linker CMake:将(独立)库拆分为不同的目标链接库调用?

Linker CMake:将(独立)库拆分为不同的目标链接库调用?,linker,cmake,Linker,Cmake,假设我有一个目标a,它取决于库B和C。但是B和C没有相互依赖性。与CMake的链接可能看起来像 target_link_libraries( A B C ) 但是 也似乎有效(并且可能更易于维护)。将目标链接库命令拆分为多个命令是否有缺点?还是应该始终将其放在一个命令中,以防最终遇到库之间的相互依赖?这两种方法都是有效且等效的。基本上,target\u link\u libraries命令只是将指定的库附加到传递的目标的link\u INTERFACE\u libraries属性中(A)。两者

假设我有一个目标
a
,它取决于库
B
C
。但是
B
C
没有相互依赖性。与CMake的链接可能看起来像

target_link_libraries( A B C )
但是


也似乎有效(并且可能更易于维护)。将目标链接库命令拆分为多个命令是否有缺点?还是应该始终将其放在一个命令中,以防最终遇到库之间的相互依赖?

这两种方法都是有效且等效的。基本上,
target\u link\u libraries
命令只是将指定的库附加到传递的目标的
link\u INTERFACE\u libraries
属性中(
A
)。两者都说A依赖于B,A依赖于C。两者都没有提到B和C之间的任何依赖关系,所以没有

我不确定你所说的“相互依赖”是什么意思——当考虑B和C时,有4种可能性:(1)两者都不依赖于对方,(2)B依赖于C,(3)C依赖于B,或者(4)它们都相互依赖

(1) 这就是你所拥有的。(2) 和(3)意味着您应该添加另一个target_link_libraries命令,分别使用“bc”或“cb”作为参数。(4) 这意味着您有一个循环依赖关系,它们实际上不应该是单独的库,而是组合成一个逻辑实体。您应该避免(4),因为这使得在某些(所有?)平台上无法作为共享库加载

两个单独的目标链接库调用的性能损失可以忽略不计。我怀疑你能否衡量业绩并显示出任何显著的时间差异

为了澄清这一点,这一呼吁:

target_link_libraries(A B C)
表示目标A需要库B和库C

如果你考虑上面的情况(2),其中B依赖于C,你将写:

target_link_libraries(B C)
target_link_libraries(A B)
这意味着目标B需要库C,目标A需要库B(CMake会自动将B的依赖项传递到A,这样您就不必知道任何A->C依赖项,除非您有调用库C中功能的显式代码)


您应该始终表达将事物联系在一起所需的最小依赖信息。

抱歉,有点含糊不清:我所说的“相互依赖”是指(2)和(3)种情况,我没有想到循环依赖。问题是——据我所知,对于案例(2)或(3),在一个
target\u link\u库中放置所有的
命令,CMake将自动识别例如B对C的依赖性(除了A对C),并进行链接。如果我把答案分成两行,那么在案例(2)和(3)中也可以吗?我编辑了我的答案,在底部添加了“澄清”部分。除了目标A依赖于库B和C之外,CMake无法识别“目标链接库(AB C)”中的任何内容。您必须仅指定直接依赖的库。CMake将自动链接到间接提到的库,直到到达依赖链的末尾。
target_link_libraries(B C)
target_link_libraries(A B)