静态库链接但仍未定义引用

时间:2014-10-15 21:35:15

标签: c++ curl static linker libcurl

我试图将libcurl静态链接到我的程序(只是libcurl,而不是它的所有依赖项)。我自己构建了libcurl,以便将依赖关系降到最低级,无论如何都应该出现在大多数Linux系统上。

我尝试用

编译
g++ foo.cpp -I/tmp/curl/include/curl/ -L/tmp/curl/lib/libcurl.a

但仍然得到

curl_downloads.cpp:(.text+0xe): undefined reference to `curl_global_init'
/tmp/ccY0XMUo.o: In function `curlDownloadToFile(void*, std::string const&, std::string const&, std::string const&, std::string)': 
curl_downloads.cpp:(.text+0x36): undefined reference to `curl_easy_init'
curl_downloads.cpp:(.text+0xcb): undefined reference to `curl_easy_escape'
curl_downloads.cpp:(.text+0x119): undefined reference to `curl_easy_setopt'
curl_downloads.cpp:(.text+0x15d): undefined reference to `curl_easy_setopt'
curl_downloads.cpp:(.text+0x178): undefined reference to `curl_easy_setopt'
curl_downloads.cpp:(.text+0x192): undefined reference to `curl_easy_setopt'
...

但nm libcurl.a显示

nm libcurl.a | grep easy
                 U curl_easy_unescape
0000000000000000 T curl_easy_escape
00000000000002f0 T curl_easy_unescape
libcurl_la-easy.o:
0000000000000590 T curl_easy_cleanup  
0000000000000630 T curl_easy_duphandle
00000000000005f0 T curl_easy_getinfo
0000000000000270 T curl_easy_init
00000000000008e0 T curl_easy_pause
0000000000000350 T curl_easy_perform
0000000000000a60 T curl_easy_recv
0000000000000800 T curl_easy_reset
0000000000000ad0 T curl_easy_send
00000000000002b0 T curl_easy_setopt
0000000000000080 t easy_connection
0000000000001580 T Curl_multi_set_easy_connection
             U curl_easy_init
0000000000000000 T curl_easy_strerror

所以功能应该存在。 我也尝试了g ++调用中每个可能的参数顺序,我总是得到缺少的引用。

那我在这里错过了什么?

1 个答案:

答案 0 :(得分:2)

  

g ++ foo.cpp -I / tmp / curl / include / curl / -L / tmp / curl / lib / libcurl.a

归档(*.a)文件只是目标文件的集合(*.o)。因此,您可以像对象文件一样指定存档。

在您的情况下,请删除-L-L是路径,而不是库包含切换),并指定存档的完全限定路径:

g++ foo.cpp -I/tmp/curl/include/curl/ -o foo.exe /tmp/curl/lib/libcurl.a