这似乎是一个古老的问题。
想象一下,我们有一个名为 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。