ld找不到lib链接

时间:2010-07-29 02:14:02

标签: unix build-process ld

以下是描述我的问题的示例:

ld -Lpath1 -Lpath2 -lA -lB -Xlinker -T -Xlinker \
    -W1,-rpath,/usr/local/lib -l-o target
ld: cannot find -lA
collect2: ld returned 2 exit status

path1和path2都是相对路径,我可以根据ld的pwd找到库A,那么为什么ld会输出这个错误信息?

有人能给我一些调试这个问题的建议吗?

我想念一些,在名为rt的图书馆之前有一个“-static”。

作为你的建议,我试着让gcc驱动ld做链接过程。 gcc A.o B.o -mabi = 64 -static -lrt -Xlinker -T -Xlinker ld.script -W1,-rpath,/ usr / local / lib -lmemdbg -o target 它不起作用。

然后我删除了“-static”选项,并在-lpthread之后删除了另一个动态库(因为rt依赖于我删除“-static”时找到的pthread)

gcc A.o B.o -mabi = 64 -lrt -lpthread -Xlinker -T -Xlinker ld.script -W1,-rpath,/ usr / local / lib -lmemdbg -o target 这次,对象成功地连接在一起。

然后我尝试通过将“-v”传递给gcc来弄清楚为什么“-static”命令不起作用 。出现了一些“-L”选项,并在搜索列表中找到一个名为librt.a的库。

我真的很困惑。 gcc的版本是4.3

1 个答案:

答案 0 :(得分:1)

可能存在各种因素:

  • 你在找什么名字? path1/libA.apath1/libA.so
  • -W1选项应该是-Wl,但这不会导致链接错误。
  • -l-o选项应该是两个带-l选项参数的选项(除非你真的有一个库lib-o.alib-o.so)。
  • 您通常会指定至少一个您自己设计的目标文件;只有Lex / Yacc库(我知道)为你提供main() - 而且只在经典的Unix而不是Linux系统上。
  • 如果库文件存在于您认为的位置,那么它们是否是正确的类型?也就是说,如果您正在构建一个32位程序,它们可能是64位库 - 反之亦然?它们适用于您的硬件吗? (通常情况下,我希望链接器能说出比'找不到'更合适的内容,但这可能是一个问题。)
  • 您是否已检查过库文件和目录的权限?
  • 你最好不要直接调用加载器,而是使用编译器为你调用加载器吗?我的经验是编译器比我更了解有关正确调用加载器的信息 - 而且我看到有更多的人在使用ld时直接使用共享对象而不是使用编译器时会感到悲痛。