假设我有一个A
依赖于库B
和目标的目标C
.但是B
并C
没有相互依赖.与CMake的链接看起来像
target_link_libraries( A B C )
Run Code Online (Sandbox Code Playgroud)
但
target_link_libraries( A B )
target_link_libraries( A C )
Run Code Online (Sandbox Code Playgroud)
似乎也有效(并且可能更容易维护).是否存在将target_link_libraries命令拆分为多个命令的缺点?或者,如果一个人最终确实遇到了图书馆的相互依赖,那么是否应该总是把它放在一个命令中?
那些完全相同.两者都说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)
Run Code Online (Sandbox Code Playgroud)
意味着目标A需要库B和C.
相反,如果你考虑上面的情况(2),其中B依赖于C,你会改为写:
target_link_libraries(B C)
target_link_libraries(A B)
Run Code Online (Sandbox Code Playgroud)
这意味着目标B需要库C,而目标A需要库B(并且CMake会自动将B的依赖性传递到A,这样您就不必知道任何A - > C依赖性,除非您有明确的代码来调用库C中的功能).
您应该始终表达将事物链接在一起所需的最小依赖性信息.
两种方式都是有效且等效的。基本上target_link_libraries
命令只是将指定的库附加到LINK_INTERFACE_LIBRARIES
传递的目标的属性(A
在您的示例中)。
归档时间: |
|
查看次数: |
5251 次 |
最近记录: |