首页 文章

如何使用静态libcurl编译程序?

提问于
浏览
9

有以下代码:

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

如果从动态链接库中收集它,一切正常:

gcc test.c -lcurl -o test

现在我想提出一个静态程序:

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

他出错了:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o):在函数dlfcn_globallookup':( . text 0x11) :警告:在静态链接的应用程序中使用'dlopen'需要在运行时使用glibc版本中的共享库来链接/tmp/curl/lib/libcurl.a(libcurl_la-netrc.o):在functionCurl_parsenetrc':netrc.c: (.text 0x3c8):警告:在静态链接的应用程序中使用'getpwuid_r'需要在运行时使用glibc版本中的共享库来链接/tmp/curl/lib/libcurl.a(libcurl_la-curl_addrinfo.o):在函数中Curl_getaddrinfo_ex':curl_addrinfo.c :( . text 0x60):警告:在静态链接的应用程序中使用'getaddrinfo'需要在运行时使用用于链接的glibc版本的共享库

仅当您指定主机IP地址而不是example.com时,该程序才有效 . 否则程序无法解析域名:

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

如何解决名称解析问题?谢谢!

附:静态libcurl我收集了以下方法:

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

2 回答

  • 4

    我找到了一个方法 . 必须使用键“--enable-ares”配置libcurl .

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

    然后程序将以gethostbyname为特色,并能够解析域名 .

    谢谢大家的评论 .

  • 3

    这是动态libcurl的外观 .

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

    如果您只想静态链接curl,请不要使用-static . 只需将libcurl.a添加为对象文件之一或使用-lcurl,就不需要指定它两次 . 后

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

    你会得到

    $ 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意味着你想要静态链接 . 然后你需要所有准备为静态的库,结果将是:

    $ ldd test
        not a dynamic executable
    

相关问题