CMake:将(独立)库拆分成不同的target_link_libraries调用?

时间:2011-08-31 08:46:11

标签: linker cmake

假设我的目标A取决于库BC。但是BC没有相互依赖。与CMake的链接看起来像

target_link_libraries( A B C )

但是

target_link_libraries( A B )
target_link_libraries( A C )

似乎也有效(并且可能更容易维护)。是否存在将target_link_libraries命令拆分为多个命令的缺点?或者,如果一个人最终确实遇到了图书馆的相互依赖,那么总是应该把它放在一个命令中吗?

2 个答案:

答案 0 :(得分:7)

这些完全相同。两者都说A取决于B而A取决于C.两者都没有说明B和C之间的任何依赖关系,所以没有。

我不确定你的意思是“相互依赖” - 当考虑B和C时,有4种可能性:(1)既不依赖于另一种,(2)B依赖于C,(3)C取决于B,或(4)它们彼此依赖。

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

对于两个单独的target_link_libraries调用,性能损失可以忽略不计。我怀疑你是否可以测量性能并显示任何显着的时序差异。

澄清一下,这个电话:

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)中的功能。

您应该始终表达将所有内容链接在一起所需的最低依赖关系信息。

答案 1 :(得分:3)

两种方式都是有效且等效的。基本上target_link_libraries命令只是将指定的库附加到传递的目标的LINK_INTERFACE_LIBRARIES属性中(样本中为A)。