我试图将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 ++调用中每个可能的参数顺序,我总是得到缺少的引用。
那我在这里错过了什么?
答案 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