说我有目标A
这取决于库B
and C
. But B
and C
没有相互依赖。与 CMake 的链接可能看起来像
target_link_libraries( A B C )
but
target_link_libraries( A B )
target_link_libraries( A C )
似乎也有效(并且可能更容易维护)。将 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”作为参数或“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 中的功能)。
您应该始终表达将事物链接在一起所需的最小依赖信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)