2015-08-19 8 views
6

Es gibt einen folgenden Code:Wie kompiliere ich ein Programm mit statischer libcurl?

#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; 
} 

Alles funktioniert gut, wenn man es aus dem Dynamic Link Library sammeln:

gcc test.c -lcurl -o test 

Jetzt möchte ich ein statisches Programm erhöhen:

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

Er geht mit Fehlern:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In der Funktion 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 :(. text + 0x3c8): warning: Die Verwendung von 'getpwuid_r' in statisch verknüpften Anwendungen erfordert zur Laufzeit die gemeinsam genutzten Bibliotheken aus der zum Verknüpfen verwendeten glibc-Version /tmp/curl/lib/libcurl.a(libcurl_la-curl_addrinfo.o) : in Funktion `Curl_getaddrinfo_ex ':. curl_addrinfo.c :(text + 0x60): Warnung: mit 'erfordert für die gemeinsam genutzten Bibliotheken von der glibc Version zur Laufzeit getaddrinfo' in statisch gelinkte Anwendungen

Das Programm verbindet funktioniert nur, wenn Sie eine Host-IP-Adresse und nicht example.com angeben. Andernfalls kann das Programm den Domain-Namen nicht auflösen:

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

Wie kann ich das Problem der Namensauflösung zu lösen? Vielen Dank!

P.S. Static Libcurl Ich sammelte die folgende Methode:

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

Ich sehe nicht, wie die von Ihnen geposteten Warnungen sich auf das von Ihnen beschriebene Problem beziehen. –

+0

Sie möchten mit den statischen Versionen von __all__ Bibliotheken oder einfach mit 'libcurl' verlinken?Auch warum geben Sie es zweimal an (das von 'tmp' und' -lcurl'; Sie sollten '-L' verwenden, um Bibliothekspfade anzugeben: Überprüfen Sie [ld man page] (http://linux.die.net /man/1/ld)).Nach dem statischen Erstellen Ihrer Anwendung, was ist 'ldd test' Ausgabe? – CristiFati

Antwort

0

Dies ist, wie es mit dynamischer Libcurl aussieht.

$ 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) 

Wenn Sie nur statisch locken möchten, verwenden Sie -static nicht. Fügen Sie einfach libcurl.a als eine der Objektdateien hinzu oder verwenden Sie -lcurl, Sie müssen es nicht zweimal angeben. Nach

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

finden Sie

$ 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) 

-static Mittel erhalten, die Sie statisch verknüpfen alle wollen. Dann müssen Sie alle Bibliotheken als statische vorbereitet und das Ergebnis wird:

$ ldd test 
    not a dynamic executable 
+0

Danke für Ihre Antwort, aber Sie haben mich nicht verstanden. Ich habe kein Problem mit der statischen Kompilierung. Das Problem ist, dass in einem statisch kompilierten Programm die Domain-Namensauflösung nicht funktioniert. –

+0

Sie haben erwähnt, dass Sie Warnungen erhalten, wenn sie eingehalten werden. Haben Sie es geschafft, es ohne Warnungen zu kompilieren? Ich habe Ihren Code ausprobiert und er funktioniert auch wenn er statisch verknüpft ist. – rastik

3

Ich fand einen Weg. libcurl muss mit dem Schlüssel "--enable-ares" konfiguriert werden.

./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 

Dann wird das Programm gethostbyname bieten und in der Lage sein, den Domain-Namen aufzulösen.

Vielen Dank für die Kommentare.

Verwandte Themen