【问题标题】:trouble compiling against static library针对静态库编译的麻烦
【发布时间】:2014-03-25 01:31:37
【问题描述】:

我创建了一个静态库libstuff.a,其中包含gccar。我已经在/custom/lib/dir/ 中安装了库,在/custom/include/dir/ 中安装了头文件。当我尝试针对存档编译另一个应用程序时,我遇到了问题。

我试图编译的应用程序基本上使用gcc -L/custom/lib/dir/ -I/custom/include/dir/ -lstuff

当我尝试编译时,我收到关于我在 stuff.h 中声明并在 stuff.c 中定义的函数的错误。

main.c:51: undefined reference to `stuff_init'
collect2: error: ld returned 1 exit status

如果我从/custom/lib/dir/ 中删除libstuff.a,编译器会抱怨/usr/bin/ld: cannot find -lstuff。如果我把它放回去,它不会抱怨。所以它正确地找到了存档。

如果我从 main.c 中删除代码行 #include "stuff.h",gcc 会抱怨 stuff_init 未定义,因此它可以正确找到标题。

如果我运行nm libstuff.a,则输出包括0000000000000000 T stuff_init。所以函数是在归档文件中定义的。

那我做错了什么?

【问题讨论】:

  • 共享库不是用àr(1) 创建的,libfoo.a 是一个静态 库。检查您的构建说明。
  • 对不起,我的意思是静态而不是共享。谢谢:)
  • 你真的应该显示你的准确和完整的链接命令行。 “基本上”很好,但不够具体。
  • -lstuff before 是链接行上的目标文件还是之后?它需要在它之后

标签: c linux gcc linker unix-ar


【解决方案1】:

您没有显示确切的链接行,但您可能应该(但不)在目标文件之后列出库:

gcc -o program main.o -L/custom/lib/dir -lstuff

如果库之外有多个目标文件,则将它们全部列在任何库之前。 -L 选项可以放在使用给定目录中的库的 -llib 选项之前的任何位置。

【讨论】:

  • 解决了。我的 -l-L 标志出现在我的目标文件之前。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2015-10-07
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多