gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:50:27 25 4
gpt4 key购买 nike

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

target_link_libraries( A B C )


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 中的功能的显式代码)。

您应该始终表达将事物链接在一起所需的最少依赖信息。

关于linker - CMake:将(独立)库拆分为不同的 target_link_libraries 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com