Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix ld can';找不到要链接的库_Unix_Build Process_Ld - Fatal编程技术网

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库(据我所知)为您提供了
    main()
    ——并且仅在经典的Unix系统上提供,而不是在Linux系统上
  • 如果库文件存在于您认为存在的位置,那么它们是正确的类型吗?也就是说,如果您正在构建一个32位程序,那么它们可能是64位库,或者反之亦然?它们是为你的硬件准备的吗?(通常情况下,我希望链接者说一些比“找不到”更贴切的话,但这可能是一个问题。)
  • 您是否检查了对库文件和目录的权限
  • 您最好不要直接调用加载程序,而是使用编译器为您调用加载程序?我的经验是,编译器比我更了解如何正确调用加载程序,而且我看到更多的人在直接使用
    ld
    而不是使用编译器时构建共享对象

可能有各种问题:

  • 你在找什么名字<代码>路径1/libA.a<代码>路径1/libA.so
  • -W1
    选项可能应该是
    -Wl
    ,但这不能解释链接错误
  • -l-o
    选项可能应该是两个带有
    -l
    选项参数的选项(除非您确实有一个库
    lib-o.a
    lib-o.so
  • 您通常至少指定一个您自己设计的目标文件;只有Lex/Yacc库(据我所知)为您提供了
    main()
    ——并且仅在经典的Unix系统上提供,而不是在Linux系统上
  • 如果库文件存在于您认为存在的位置,那么它们是正确的类型吗?也就是说,如果您正在构建一个32位程序,那么它们可能是64位库,或者反之亦然?它们是为你的硬件准备的吗?(通常情况下,我希望链接者说一些比“找不到”更贴切的话,但这可能是一个问题。)
  • 您是否检查了对库文件和目录的权限
  • 您最好不要直接调用加载程序,而是使用编译器为您调用加载程序?我的经验是,编译器比我更了解如何正确调用加载程序,而且我看到更多的人在直接使用
    ld
    而不是使用编译器时构建共享对象

很抱歉我的疏忽,“-l-o”应该是“-lC-o”,而C是一个共享库名称。我没有粘贴真正的编译输出的原因是工作环境与互联网隔离。这个问题是由交叉编译上下文引起的,当我试图从cpu提供程序升级sdk时,包括工具链和其他需要重新编译的东西。@Joyes:您是否包含正确的标志来告诉加载程序这是交叉编译(交叉链接)?坦白地说,这是一个额外的例子,说明了为什么我建议使用编译器而不是原始链接器——很难将所有正确的标志都设置到位。编译器是GCC吗?如果是这样,您是否尝试过使用“
-v
”选项进行简单的交叉编译(包括链接阶段),以查看哪些选项被传递到链接器?很抱歉,我粗心大意,“-l-o”应该是“-lC-o”,而C是一个共享库名称。我没有粘贴真正的编译输出的原因是工作环境与互联网隔离。这个问题是由交叉编译上下文引起的,当我试图从cpu提供程序升级sdk时,包括工具链和其他需要重新编译的东西。@Joyes:您是否包含正确的标志来告诉加载程序这是交叉编译(交叉链接)?坦白地说,这是一个额外的例子,说明了为什么我建议使用编译器而不是原始链接器——很难将所有正确的标志都设置到位。编译器是GCC吗?如果是这样,您是否尝试过使用“
-v
”选项进行简单的交叉编译(包括链接阶段),以查看哪些选项传递给链接器?