静态链接中目标文件和库的排序
Ordering of object files and libraries in static linking
我使用 AR 工具从简单的 addv.o
和 multo.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 使用静态库或共享库时有效。
我使用 AR 工具从简单的 addv.o
和 multo.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 使用静态库或共享库时有效。