【发布时间】:2015-02-28 21:03:41
【问题描述】:
我使用简单的addv.o 和multo.o 的AR 工具创建了一个简单的静态库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'
我想知道为什么我先指定库时会出错?排序是否重要?
【问题讨论】:
-
是的,顺序很重要,因为当链接器首先看到
./libvec.a库时,它不会找到引用该库中函数的任何内容,因此不会加载库中的任何内容。如果 A 依赖于 B,则在链接时,B 在命令行上必须始终位于 A 之后。 -
如果您使用 gcc 和 ld,通常可以通过在库之前列出您的对象first,然后以从大到小的依赖顺序列出您的库,从而成功链接。对于某些实现,后者是一个记录不充分的要求,而对于另一些实现,它几乎没有什么区别。
标签: c gcc linker static-linking