【问题标题】:Ordering of object files and libraries in static linking静态链接中目标文件和库的排序
【发布时间】:2015-02-28 21:03:41
【问题描述】:

我使用简单的addv.omulto.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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多