1

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

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 傲博 -mabi=64 -static -lrt -Xlinker -T -Xlinker ld.script -W1,-rpath,/usr/local/lib -lmemdbg -o target 不行。

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

gcc 傲博 -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

4

1 回答 1

1

有各种问题可能是因素:

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