0

这似乎是一个古老的问题。

想象一下,我们有一个名为 juggle 的可执行文件,它具有以下依赖项:

杂耍 → libfoo.a → libbar.a

然后,我们必须像这样编写链接命令:

g++ -o juggle juggle.cpp -lfoo -lbar

但不是:

g++ -o juggle juggle.cpp -lbar -lfoo

链接 .so(例如 libpickle.so)时也存在此问题。如果 lib list 编写不当,bar 的代码不会进入 pickle 但链接成功。只有当您尝试动态加载 libpickle.so 时,您才会意识到您错过了 bar。

这是一个过于简化的例子。在现实世界中,我经常面对如此多的库(许多来自我们自己的团队)来链接和记住库依赖顺序可能是一种负担。我说“负担”是因为有一些其他编译器(Visual C++)不会把这个负担放在我们身上。

所以,我认为最好总是写两次链接器组件,

g++ -o juggle juggle.cpp -lfoo -lbar -lfoo -lbar

并且,当存在循环依赖时,这也有效。

有没有人和我有同样的想法,或者更好的解决方案?

编辑:我终于意识到仅仅两次编写链接器组件并不一定会使链接成功。假设依赖 A -> B -> C ,我们按照 CBA 的顺序列出库,我们必须写三遍 CBA。

4

2 回答 2

3

另一种选择是使用链接器--start-group--end-group选项来指定一组具有循环依赖关系的库。

有关更多信息,请参阅此 SO 答案。

于 2012-05-07T01:35:00.667 回答
2

在您提出的替代方案中,更好的主意是以-l正确的顺序编写选项,以便按顺序解决依赖关系。只有在您具有循环库依赖项-l(您应该避免)的情况下,您才需要在选项中两次提及同一个库。

于 2012-05-07T01:27:56.087 回答