Referência “indefinida” relacionada a SSL em libssh2 e libcurl libs ao compilar C no OpenSUSE

2

Eu tenho tentado compilar um software C, mas estou recebendo 'referência indefinida' sobre bibliotecas SSL, eu acho. As bibliotecas que ele menciona estão lá, na verdade eu as compilei novamente: zlib + openssl + openssh. Erro persistir.

OS openSUSE Leap 42.1.

gcc (SUSE Linux) 4.8.5

GNU Make 4.0

O erro ao compilar (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

Informações de dependência de bibliotecas:

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)

Existe uma dependência ausente? Obrigado.

    
por user174141 08.06.2016 / 18:12

1 resposta

2

As mensagens de erro estão próximas do final; o começo não é mostrado.

O ldd não mostra os nomes de caminho usados para vincular novos programas. Mostra apenas nomes de caminho usados para programas em execução. Você pode estar perdendo o pacote de desenvolvimento para o OpenSSL, que incluiria links simbólicos para nomes terminando com ".so" (que apontaria para os nomes de biblioteca com versão que você mostra na ldd output).

Por exemplo, no meu OpenSuSE 13, eu tenho libopenssl-devel-1.0.1k-11.87.1.x86_64 , que contém os links simbólicos

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

Além disso, ldd mostra isso:

    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)

que tem libz instalado no sistema, em vez de embutido em /usr/local/lib , por exemplo, de libz1-1.2.8-3.1.2.x86_64 (por que você compilou esta biblioteca não está claro, pois já era uma dependência do libssh2.so que está em sua área do sistema).

Geralmente ldd marcará bibliotecas que não podem ser encontradas. Seu substituto libz.so pode ser um problema, por exemplo, se não for o mesmo modelo que o arquivo que ele substituiu. Você pode comparar isso usando o utilitário file . Além disso, você pode obter mais informações sobre as bibliotecas reais usadas para vincular usando a opção detalhada -v (no caso de tentar usar bibliotecas que possuam os mesmos nomes das dependências mostradas por ldd ).

    
por 08.06.2016 / 21:43