当我将 Ubuntu 发行版升级到 11.10 后,我开始看到 gcc 的奇怪链接器行为。我能够通过移动我的-l
gcc 命令末尾的参数(我的问题与中描述的问题类似)这个线程 https://stackoverflow.com/questions/7824439/c-math-linker-problems-on-ubuntu-11-10,并且建议的解决方案对我有用......谢谢!)。
我的问题是...为什么我现在才出现这个问题?我在 OS X 和 Ubuntu 上开发和测试这段代码已经有一段时间了:我从来不知道这一点-l
命令应该在您的 .c 文件之后执行,但即便如此,这以前从未给我带来过问题。我猜这与 GCC 版本的关系比 Ubuntu 发行版本的关系更大。
这个新版本是否只是比早期版本更严格地执行此要求?
对于 gcc 以及其他编译器(例如 clang),链接器命令参数的顺序确实很重要。
根据经验,在编写链接器命令时我将使用以下顺序:
- 目标文件 (*.o)
- 静态库(*.a)
- 共享库(*.so)
共享库的顺序也很重要。如果 libfoo.so 依赖于 libbar.so,您应该列出-lfoo
before -lbar
.
如果您不知道确切的依赖关系,这可能会变得非常复杂。 Linux 上的以下命令可能会有所帮助:
ldd /path/to/libfoo.so
这列出了 libfoo.so 所依赖的所有共享库。
至于你的问题为什么你的特定 gcc 版本会出现这个问题,在不知道你的应用程序需要哪些库的情况下很难判断。但如果您应用我上面描述的顺序,它应该适用于较旧和较新的 gcc 版本。
提示:如果使用正确,CMake 可以为您处理所有依赖项...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)