【问题标题】:ld is unable to find fileld 找不到文件
【发布时间】:2015-05-13 14:18:34
【问题描述】:

我在 RedHat 系统上工作。

uname -m 
x86_64

所有的库都是 32 位的。

/usr/bin/ld lib/libssh2.so
lib/libssh2.so could not read symbols: File in wrong format

file lib/libssh2.so
lib/libssh2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

编译时出现错误:

usr/bin/ld: cannot find -lssh2
collect2: ld returned 1 exit status

编译命令:

g++ src/Testcase.o src/Test.o -L../testcase/lib -L/usr/lib -L/usr/lib \
    -lcrypto -lz -lpthread -lssl -lcurl -lssh2 -o ./debug/testcase

【问题讨论】:

  • 你需要安装64位版本的SSH2库,或者指定64位版本的安装位置,或者将软件重建为32位代码(使用@987654325 @ 和/或 gcc -m32)。
  • 我正在用 32 位代码构建 sw。 /usr/bin/ld lib/libssh2.so.1.0.1 lib/libssh2.so.1.0.1:无法读取符号:文件格式错误,文件 lib/libssh2.so.1.0.1 lib/libssh2.so。 1.0.1:ELF 32 位 LSB 共享对象,Intel 80386,版本 1 (SYSV),动态链接,剥离
  • 你确定吗? file src/Test.ofile /usr/lib/libz.so 的输出是什么(对于任何通往 -lz 库的路径)?在许多(大多数?)x86_64 系统上,默认编译模式是 64 位。您应该指定-L ./lib 来查找lib/libssh2.so(其中./ 是可选但显式的,并且空格也是可选的)。
  • @JonathanLeffler .. 是的,它生成 32 位库。 file 输出显示 lib 文件是 32 位的。
  • file lib/libssh2.so 是否提供与其他共享库完全相同的文件类型消息?还是有区别?您是构建了lib/libssh2.so,还是从其他地方收集了副本? ldd lib/libssh2.so 可以正常工作吗?您是否打算在安装软件时将libssh2.so 安装到系统目录中 - 哦,现在不要担心,但是一旦您的代码成功链接,这将成为一个需要考虑的问题。跨度>

标签: linux gcc linker g++


【解决方案1】:

有两个错误。

第一个说libssh2.so是一个32位共享库,但是你链接的是64位平台。在 64 位平台上,它通常默认链接到 64 位对象。将-m32 开关添加到您的编译和链接命令行以在 32 位模式下构建和链接。

第二个是链接器找不到-lssh2。在这种情况下,您需要指定查找-lssh2 的目录,例如-L/usr/local/lib -lssh2.

【讨论】:

  • @Goku 你到底尝试了什么?
  • @Goku 为您更新了答案。
  • 所有的库都是 32-bits 的。我更改了makefile添加了-m32并再次编译了代码。用于编译的命令:- g++ -m32 src/Testcase.o src/Test1.o -L../testcase/lib -L/usr/lib -L/usr/lib64 -L/usr/lib -lz -lpthread - lssl -lcurl -lssh2 ./debug/testcase
  • 它在 /usr/lib 中搜索。我需要明确添加 -L/usr/lib -lssh2 吗? usr/bin/ld: 搜索-lssh2时跳过不兼容的/usr/lib/libssh2.so /usr/bin/ld: 找不到-lssh2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2017-10-23
  • 2021-05-07
  • 2018-10-20
  • 2021-12-21
  • 2015-01-30
  • 2018-06-15
相关资源
最近更新 更多