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

2024-02-23

说我有目标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(使用前将#替换为@)

CMake:将(独立)库拆分为不同的 target_link_libraries 调用? 的相关文章

随机推荐