【发布时间】:2015-08-19 18:07:30
【问题描述】:
有如下代码:
#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): 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 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
【问题讨论】:
-
我看不出您发布的警告与您描述的问题有何关联。
-
您想链接 all 库的静态版本还是简单地使用
libcurl?还有为什么要指定两次(tmp和-lcurl中的一个;您应该使用-L来指定库路径:检查ld man page)。静态构建应用程序后,ldd test输出是什么?