静态链接中目标文件和库的排序

Ordering of object files and libraries in static linking

我使用 AR 工具从简单的 addv.omulto.o 创建了一个简单的静态库 libvec.a。目标文件 addv.o 包含 1 个函数符号 (addvec),multo.o 包含 1 个函数 (multvec)。我还编写了一个简单的程序来测试它(driver.c 它添加了 2 个向量并使用了库中的 addvec 函数;它还包含了定义函数原型的 vector.h)。然后我用

编译了它
gcc -static driver.o ./libvec.a

一切顺利。但起初我试图用

编译它
gcc -static ./libvec.a driver.o

我得到一个错误:

undefined reference to 'addvec'

我想知道为什么我第一次指定库时会出错?顺序应该重要吗?

总是 link 对象文件在库之前,期间。

问题是 linker 扫描图书馆,它正在寻找 main()。它没有找到它,所以它不会从库中取出任何东西。然后它扫描 driver.o,找到正在寻找的东西,但不是 libvec.a 中的东西(它已经忘记了,因为它们不相关)。因此,来自 libvec.a 的函数是未满足的引用 — linking 失败。

请注意 'object files before libraries' 在 link 使用静态库或共享库时有效。