【问题标题】:ld can't find lib to linkld 找不到要链接的库
【发布时间】:2010-07-29 02:14:02
【问题描述】:

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

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输出这个错误msg呢?

谁能给我一些调试这个问题的建议?

我想念一些,在一个名为 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

【问题讨论】:

    标签: unix build-process ld


    【解决方案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 而不是使用编译器时构建共享对象。

    【讨论】:

    • 对不起,我的粗心,“-l-o”应该是“-lC -o”,C是共享库名。我没有粘贴真正的编译输出的原因是工作环境与互联网隔离。这个问题是由交叉编译上下文引起的,当我尝试从 cpu 提供程序升级 sdk 时,包括工具链和其他一些需要再次编译的东西。
    • @joeys:你是否包含了正确的标志来告诉加载器这是一个交叉编译(cross-linking)?坦率地说,这是我为什么建议使用编译器而不是原始链接器的一个额外示例 - 很难获得所有正确的标志。编译器是 GCC 吗?如果是这样,您是否尝试过使用“-v”选项进行简单的交叉编译(包括链接阶段),以查看传递给链接器的选项?
    猜你喜欢
    • 2023-03-11
    • 2017-06-29
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多