C 소프트웨어를 컴파일하려고 했는데 SSL 라이브러리에 "정의되지 않은 참조"가 나타나는 것 같습니다. 거기에 언급된 라이브러리가 있었고 실제로 다시 컴파일했습니다: zlib + openssl + openssh. 오류가 여전히 존재합니다.
운영 체제 openSUSE Leap 42.1.
gcc(수세 리눅스) 4.8.5
GNU 메이크 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
)를 사용합니다.
libopenssl-devel-1.0.1k-11.87.1.x86_64
예를 들어 내 OpenSuSE 13에는 다음을 포함하는 심볼릭 링크가 있습니다.
/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)
이는 from 과 같이 libz
내장되지 않고 시스템에 설치 됩니다(이 라이브러리는 이미 시스템 영역에 종속 되어 있으므로 컴파일한 이유는 명확하지 않습니다 )./usr/local/lib
libz1-1.2.8-3.1.2.x86_64
libssh2.so
ldd
찾을 수 없는 라이브러리는 일반적으로 표시됩니다. libz.so
예를 들어, 교체하는 파일과 동일한 모델이 아닌 경우 교체에 문제가 있을 수 있습니다. 이 file
유틸리티를 사용하여 비교할 수 있습니다. 또한 링크에 사용된 실제 라이브러리에 대한 자세한 정보를 얻기 위해 verbose 옵션을 사용할 수 있습니다 -v
(표시된 종속성과 동일한 이름을 갖는 라이브러리를 사용하려고 시도하는 경우 ldd
).