【发布时间】:2019-07-05 11:54:13
【问题描述】:
假设我有两个静态构建的库。 libFoo.a 和 libBar.a.
libFoo.a 使用来自 libBar.a 的函数,而 libBar.a 也恰好使用来自 libFoo.a 的函数。
现在,让我们创建一个使用 libFoo 和 libBar 的程序 baz.cpp。通常,您会输入:
g++ baz.cpp -lfoo -lbar
但是,因为这两个静态库相互使用......我没有明显的解决方案来让编译时链接器接受这种情况并将它们链接在一起。
这是否是 C++ 标准所允许的明智和允许的事情?如果是这样,是否有一种非 hacky 的方式来处理这个问题?
或者首选的方法是将 libBar 和 libFoo 中的所有目标文件一起编译到一个静态库中?
【问题讨论】:
-
C++ 标准对库无话可说。处理此问题的通常方法是两次提及其中一个库
-lfoo -lbar -lfoo -
我认为你可以运行两个libraries.a文件,至少在某些系统上是这样。当然,请注意,这对您的代码组织来说是一件非常奇怪的事情。
-
我认为如果你有循环依赖,那么你的库设计就有缺陷。要么将两个库合并为一个,要么重构第三个库。
-
@Jonathon:我有几次循环依赖,即使在完全正交的设计中也是如此。考虑一个需要时间信息的日志库,而时间函数也需要记录错误的可能性。请注意,调用图中不一定存在循环依赖关系,您仍然存在链接器问题。