Unix ld can';找不到要链接的库
以下是描述我的问题的示例:Unix ld can';找不到要链接的库,unix,build-process,ld,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的库之前有一个
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-to-do链接过程。
gcc A.o B.o-mabi=64-static-lrt-Xlinker-T-Xlinker ld.script-W1-rpath,/usr/local/lib-lmemdbg-o目标
它不起作用
然后我删除了“-static”选项和-lpthread之后的另一个动态lib(因为rt依赖于pthread,当我删除“-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/libA.a<代码>路径1/libA.so
选项可能应该是-W1
,但这不能解释链接错误-Wl
选项可能应该是两个带有-l-o
选项参数的选项(除非您确实有一个库-l
或lib-o.a
)lib-o.so
- 您通常至少指定一个您自己设计的目标文件;只有Lex/Yacc库(据我所知)为您提供了
——并且仅在经典的Unix系统上提供,而不是在Linux系统上main()
- 如果库文件存在于您认为存在的位置,那么它们是正确的类型吗?也就是说,如果您正在构建一个32位程序,那么它们可能是64位库,或者反之亦然?它们是为你的硬件准备的吗?(通常情况下,我希望链接者说一些比“找不到”更贴切的话,但这可能是一个问题。)
- 您是否检查了对库文件和目录的权限
- 您最好不要直接调用加载程序,而是使用编译器为您调用加载程序?我的经验是,编译器比我更了解如何正确调用加载程序,而且我看到更多的人在直接使用
而不是使用编译器时构建共享对象ld
- 你在找什么名字<代码>路径1/libA.a<代码>路径1/libA.so
选项可能应该是-W1
,但这不能解释链接错误-Wl
选项可能应该是两个带有-l-o
选项参数的选项(除非您确实有一个库-l
或lib-o.a
)lib-o.so
- 您通常至少指定一个您自己设计的目标文件;只有Lex/Yacc库(据我所知)为您提供了
——并且仅在经典的Unix系统上提供,而不是在Linux系统上main()
- 如果库文件存在于您认为存在的位置,那么它们是正确的类型吗?也就是说,如果您正在构建一个32位程序,那么它们可能是64位库,或者反之亦然?它们是为你的硬件准备的吗?(通常情况下,我希望链接者说一些比“找不到”更贴切的话,但这可能是一个问题。)
- 您是否检查了对库文件和目录的权限
- 您最好不要直接调用加载程序,而是使用编译器为您调用加载程序?我的经验是,编译器比我更了解如何正确调用加载程序,而且我看到更多的人在直接使用
而不是使用编译器时构建共享对象ld
-v
”选项进行简单的交叉编译(包括链接阶段),以查看哪些选项被传递到链接器?很抱歉,我粗心大意,“-l-o”应该是“-lC-o”,而C是一个共享库名称。我没有粘贴真正的编译输出的原因是工作环境与互联网隔离。这个问题是由交叉编译上下文引起的,当我试图从cpu提供程序升级sdk时,包括工具链和其他需要重新编译的东西。@Joyes:您是否包含正确的标志来告诉加载程序这是交叉编译(交叉链接)?坦白地说,这是一个额外的例子,说明了为什么我建议使用编译器而不是原始链接器——很难将所有正确的标志都设置到位。编译器是GCC吗?如果是这样,您是否尝试过使用“-v
”选项进行简单的交叉编译(包括链接阶段),以查看哪些选项传递给链接器?