在 OpenSUSE 上编译 C 时,libssh2 和 libcurl 库上与 SSL 相关的“未定义引用”

在 OpenSUSE 上编译 C 时,libssh2 和 libcurl 库上与 SSL 相关的“未定义引用”

我一直在尝试编译 C 软件,但我认为我在 SSL 库上得到了“未定义的引用”。它提到的库在那里,实际上我再次编译了它们:zlib + openssl + openssh。错误仍然存​​在。

操作系统 openSUSE Leap 42.1。

gcc(SUSE Linux)4.8.5

GNU Make 4.0

编译(make -j4)时出错:

/usr/lib64/libssh2.so.1: undefined reference to `EVP_aes_128_ctr'
/usr/lib64/libssh2.so.1: undefined reference to `EVP_aes_256_ctr'
/usr/local/lib64/libcurl.so: undefined reference to `SSL_CTX_set_srp_username' 
/usr/lib64/libssh2.so.1: undefined reference to `EVP_aes_192_ctr' 
/usr/local/lib64/libcurl.so: undefined reference to `SSL_CTX_set_srp_password' 
/usr/local/lib64/libcurl.so: undefined reference to `SSL_CTX_set_next_proto_select_cb' 
/usr/local/lib64/libcurl.so: undefined reference to `ERR_remove_thread_state' 
collect2: error: ld returned 1 exit status

库依赖信息:

ldd /usr/lib64/libssh2.so.1

linux-vdso.so.1 (0x00007fffcf745000)
libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007fde9b18f000)
libz.so.1 => /usr/local/lib/libz.so.1 (0x00007fde9af75000)
libc.so.6 => /lib64/libc.so.6 (0x00007fde9abcd000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fde9a9c9000)
/lib64/ld-linux-x86-64.so.2 (0x0000556ace037000)

ldd /usr/local/lib64/libcurl.so

linux-vdso.so.1 (0x00007ffecd319000)
libssh2.so.1 => /usr/lib64/libssh2.so.1 (0x00007f3e4760e000)
libssl.so.1.0.0 => /lib64/libssl.so.1.0.0 (0x00007f3e473a6000)
libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007f3e46fb1000)
liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x00007f3e46da2000)
libldap-2.4.so.2 => /usr/lib64/libldap-2.4.so.2 (0x00007f3e46b56000)
libz.so.1 => /usr/local/lib/libz.so.1 (0x00007f3e4693c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3e46594000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f3e46390000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3e46178000)
libsasl2.so.3 => /usr/lib64/libsasl2.so.3 (0x00007f3e45f5b000)
/lib64/ld-linux-x86-64.so.2 (0x000055e1d1abf000)

是否缺少依赖项?谢谢。

答案1

错误信息已接近尾声;开头没有显示。

ldd显示用于的路径名链接新节目。它仅显示用于的路径名跑步现有的计划。您可能缺少 OpenSSL 的开发包,其中包含名称的符号链接结尾与“.so”(它将指向您在输出中显示的版本化库名称ldd)。

例如,在我的 OpenSuSE 13 上,我有libopenssl-devel-1.0.1k-11.87.1.x86_64其中包含符号链接

/usr/lib64/libcrypto.so
/usr/lib64/libssl.so

另外,还ldd显示了这一点:

    linux-vdso.so.1 (0x00007ffc0d09f000)
    libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007f63ae4f3000)
    libz.so.1 => /lib64/libz.so.1 (0x00007f63ae2dd000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f63adf2f000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f63add2b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f63aeb0a000)

它已libz安装在系统中,而不是内置于 中/usr/local/lib,例如 from libz1-1.2.8-3.1.2.x86_64(您编译此库的原因尚不清楚,因为它已经是libssh2.so您系统区域中的的依赖项)。

通常ldd会标记找不到的库。您的替代品libz.so可能会出现问题,例如,如果它与其替换的文件不是同一型号。您可以使用该file实用程序进行比较。此外,您还可以使用 verbose 选项获取有关用于链接的实际库的更多信息-v(以防它尝试使用恰好与 所示的依赖项具有相同名称的库ldd)。

相关内容