gcc - 使用 gcc : order of arguments 链接库

标签 gcc ubuntu libraries

当我将我的 Ubuntu 发行版升级到 11.10 后,我开始看到 gcc 的奇怪链接器行为。我能够通过将我的 -l 参数移动到 gcc 命令的末尾来解决问题(我的问题类似于 this thread 中描述的问题,并且建议的解决方案对我有用.. .谢谢!)。

我的问题是...为什么我现在才遇到这个问题?我已经在 OS X 和 Ubuntu 上开发和测试这段代码有一段时间了:我从来不知道 -l 命令应该跟在你的 .c 文件之后,但即便如此,这从来没有给我之前的问题。我猜这与 GCC 版本有关,而不是与 Ubuntu 发行版有关。

新版本是否只是比早期版本更严格地执行此要求?

最佳答案

对于 gcc 以及其他编译器(例如 clang),链接器命令参数的顺序确实很重要。 根据经验,在编写链接器命令时我会使用以下顺序:

  1. 目标文件 (*.o)
  2. 静态库 (*.a)
  3. 共享库 (*.so)

共享库的顺序也很重要。如果 libfoo.so 依赖于 libbar.so,您应该在 -lbar 之前列出 -lfoo

如果您不知道确切的依赖关系,这可能会变得非常复杂。在 Linux 上执行以下命令可能会有所帮助:

ldd /path/to/libfoo.so

这列出了 libfoo.so 所依赖的所有共享库。

至于您的问题,为什么您的特定 gcc 版本会出现此问题,如果不知道您的应用程序需要哪些库,则很难判断。但是,如果您像我上面描述的那样应用命令,它应该适用于较旧和较新的 gcc 版本。

提示:如果使用得当,CMake 可以为您处理所有依赖项...

关于gcc - 使用 gcc : order of arguments 链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826448/

相关文章:

c - 有没有其他方法可以让程序将主机名打印到标准输出或只是 shellcode?

linux - 撤消 Lubuntu 安装?

windows - 无法在 Arduino 中编译 CapacitiveSensor 示例

javascript - 如何选择 CDN 来加载 Javascript 和 CSS 库?

C++编译问题

c++ - 共享库与接口(interface)中的 STL 对象的 GCC 兼容性

Ruby 2.2.0 无法在 Ubuntu 14.04.1 LTS 上构建

c++ - 如何将链接库从 code::blocks 项目复制到另一个项目?

c - 来自 GCC 编译器的 `__asm nop` 在 Windows 中相当于 `asm volatile("nop");`

编译 Apache Lucy