【问题标题】:Static Library linked but still undefined references静态库链接但仍未定义的引用
【发布时间】:2014-12-11 02:51:25
【问题描述】:

我正在尝试将 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++ 调用中所有可能的参数顺序,我总是得到缺少的引用。

那么我在这里错过了什么?

【问题讨论】:

  • 阅读-L 的文档,这并不意味着您认为它的作用。

标签: c++ curl static linker libcurl


【解决方案1】:

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

【讨论】:

  • 还不如缩短-I/tmp/curl/include。并提及替代方案:-L/tmp/curl/lib -lcurl.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2011-03-14
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多