2015-08-19 20 views
6

C'è un codice seguente:Come compilare un programma con libcurl statico?

#include <stdio.h> 
#include <curl/curl.h> 

int main(void){ 
    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 

    if(curl == NULL) 
    return 0; 

    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/getAccessAttributes?id=1"); 

    res = curl_easy_perform(curl); 

    if(res != CURLE_OK) { 
    fprintf(stderr, "Error: %s\n", curl_easy_strerror(res)); 
    return 0; 
    } 

    curl_easy_cleanup(curl); 
    return 0; 
} 

Tutto funziona bene se si raccolgono dalla libreria di collegamento dinamico:

gcc test.c -lcurl -o test 

Ora vorrei sollevare un programma statico:

gcc test.c /tmp/curl/lib/libcurl.a -static -lcurl -lssl -lcrypto -ldl -lm -lz -DCURL_STATICLIB -I/tmp/curl/include -o test 

Lui sta andando con errori:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): nella funzione dlfcn_globallookup': (.text+0x11): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /tmp/curl/lib/libcurl.a(libcurl_la-netrc.o): In function Curl_parsenetrc ': netrc. c :(. testo + 0x3c8): avviso: l'utilizzo di 'getpwuid_r' in applicazioni collegate staticamente richiede in fase di esecuzione le librerie condivise dalla versione glibc utilizzata per il collegamento di /tmp/curl/lib/libcurl.a(libcurl_la-curl_addrinfo.o) : in funzione `Curl_getaddrinfo_ex ':. curl_addrinfo.c :(testo + 0x60): avviso: Utilizzo 'getaddrinfo' in applicazioni collegate staticamente richiede in fase di esecuzione le librerie condivise dalla versione glibc utilizzati per il collegamento

il programma funziona solo se si specifica un indirizzo IP host e non example.com. In caso contrario, il programma non può risolvere il nome di dominio:

$ ./test 
Error: Couldn't resolve host name 

Come posso risolvere il problema della risoluzione dei nomi? Grazie!

P.S. libcurl statico ho raccolto il seguente metodo:

wget http://curl.haxx.se/download/curl-7.44.0.tar.lzma 
tar xf curl-7.44.0.tar.lzma 
cd curl-7.44.0 
./configure --disable-shared --enable-static --prefix=/tmp/curl --disable-ldap --disable-sspi --without-librtmp --disable-ftp --disable-file --disable-dict --disable-telnet --disable-tftp --disable-rtsp --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-smb --without-libidn 
make && make install 
+1

Non vedo come gli avvisi che pubblichi riguardano il problema che descrivi. –

+0

Vuoi collegarti alle versioni statiche delle librerie __all__ o semplicemente con 'libcurl'?Anche perché lo specifichi due volte (quello da 'tmp' e' -lcurl', dovresti usare '-L' per specificare i percorsi della libreria: controlla [ld man page] (http://linux.die.net /man/1/ld)).Dopo aver creato staticamente la tua applicazione, qual è l'output 'ldd test'? – CristiFati

risposta

0

Questo è come si guarda con libcurl dinamica.

$ ldd test 
    linux-vdso.so.1 (0x00007ffcca3aa000) 
    libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x00007f5536ed6000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f5536b3e000) 
    libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007f55368d3000) 
    libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007f5536503000) 
    libz.so.1 => /lib64/libz.so.1 (0x00007f55362ed000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f5537138000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f55360e9000) 

Se si desidera collegare solo il ricciolo in modo statico, non utilizzare -statico. Basta aggiungere libcurl.a come uno dei file degli oggetti o usare -lcurl, non è necessario specificarlo due volte. Dopo

gcc test.c curl-7.44.0/lib/.libs/libcurl.a -lssl -lcrypto -ldl -lm -lz -DCURL_STATICLIB -o test 

si otterrà

$ ldd test 
    linux-vdso.so.1 (0x00007ffd9a0a7000) 
    libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007f947cc7e000) 
    libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007f947c8ae000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f947c6aa000) 
    libm.so.6 => /lib64/libm.so.6 (0x00007f947c3b1000) 
    libz.so.1 => /lib64/libz.so.1 (0x00007f947c19b000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f947be03000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f947cee9000) 

mezzi -static che si desidera collegare tutti staticamente. Quindi hai bisogno di tutte le librerie preparate come statiche e il risultato sarà:

$ ldd test 
    not a dynamic executable 
+0

Grazie per la tua risposta, ma non mi hai capito. Non ho problemi con la compilazione statica. Il problema è che in un programma compilato staticamente non funziona la risoluzione dei nomi di dominio. –

+0

Hai accennato al fatto che ricevi degli avvisi quando rispettati. Sei riuscito a compilarlo senza avvertimenti? Ho provato il tuo codice e funziona anche quando collegato staticamente. – rastik

3

Ho trovato un modo. libcurl deve essere configurato con la chiave "--enable-ares".

./configure --disable-shared --enable-static --prefix=/tmp/curl --disable-ldap --disable-sspi --without-librtmp --disable-ftp --disable-file --disable-dict --disable-telnet --disable-tftp --disable-rtsp --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-smb --without-libidn --enable-ares 

Quindi il programma presenterà gethostbyname e sarà in grado di risolvere il nome del dominio.

Grazie a tutti per i commenti.

Problemi correlati