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

kod*_*r16 3 c linker gcc static-linking

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

gcc -static driver.o ./libvec.a
Run Code Online (Sandbox Code Playgroud)

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

gcc -static ./libvec.a driver.o
Run Code Online (Sandbox Code Playgroud)

我得到了一个错误:

undefined reference to 'addvec'
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我首先指定库时会出错?订购应该重要吗?

Jon*_*ler 8

始终在库之前链接目标文件,句号。

麻烦的是链接器扫描库,它正在寻找main(). 它没有找到它,所以它不会从库中取出任何东西。然后它会扫描driver.o,找到正在寻找的东西,而不是里面的东西libvec.a(它已经忘记了,因为它们不相关)。因此,来自的函数libvec.a是未满足的引用——并且链接失败。

请注意,“库之前的目标文件”在与静态库或共享库链接时起作用。