【问题标题】:Undefined references to libcurl functions对 libcurl 函数的未定义引用
【发布时间】:2017-10-05 06:27:20
【问题描述】:

我无法编译,我在 Odroid-XU4 板上使用 Ubuntu。我该如何解决这个问题?感谢您的帮助。

odroid@odroid:~/Desktop/curl_test.2$ g++ -o postit2 postit2.c -lcurl
/tmp/cc4MoKQE.o: In function `main':
postit2.c:(.text+0x2c): undefined reference to `curl_mime_init'
postit2.c:(.text+0x36): undefined reference to `curl_mime_addpart'
postit2.c:(.text+0x48): undefined reference to `curl_mime_name'
postit2.c:(.text+0x56): undefined reference to `curl_mime_filedata'
postit2.c:(.text+0xfa): undefined reference to `curl_mime_free'
collect2: error: ld returned 1 exit status
odroid@odroid:~/Desktop/curl_test.2$ curl --version
curl 7.56.0 (armv7l-unknown-linux-gnueabihf) libcurl/7.47.0 
OpenSSL/1.0.2g zlib/1.2.8 libidn/1.32 librtmp/2.3
Release-Date: 2017-10-04
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps 
pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM 
NTLM_WB SSL libz TLS-SRP UnixSockets 

【问题讨论】:

  • 也许您还安装了另一个 libcurl 版本,g++ 在链接时选择了该版本?它只对 7.56.0 中的新 API 调用发出警告...
  • 应该怎么做?我需要删除所有版本并尝试安装 libcurl 7.56.0?
  • 你可以这样做;您也可以安装和构建所需版本的 Curl 源代码,但安装它。然后通过在新的 Curl 构建中指定它们的实际文件系统位置,让您的程序为新的 Curl 版本选择头文件和静态库。如果您必须从源代码构建,安装新 Curl 的问题在于,最终构建一个缺少 SSL 支持或其他一些有用功能的版本非常容易。如果你可以从你的发行版中得到你想要的版本,那不太可能是个问题;但您的发行版可能没有该版本。
  • Евгений Сергеевич,您尝试过一些变体吗?

标签: c++ linux curl arm libcurl


【解决方案1】:
  1. 从源代码安装最新版本的 curl。无需删除现有的 curl。默认配置会将安装放置在 /usr/local 下,但您可以根据需要安装在主目录下,这不需要 root 权限。 configure 的选项是 --prefix=`。
  2. 默认情况下,编译器和链接器都将在 /usr/local 中查找。如果你安装到不同的地方,你必须告诉 tols 在哪里。编译器选项为-I<directory-to-install>/include,链接器选项为-L<directory-to-install>/lib
  3. 如果使用动态链接,则必须指定库在运行时的位置。运行时加载程序通常不会在 /usr/local 下查找,因此即使安装在那里也必须指定它。相关的 gcc 选项是-Wl,-rpath=<directory-where-libcurl.so-lives-at-run-time>。除非您正在为不同的机器编译,否则这是安装 libcurl.so 的同一目录,因此您最终可能会使用 -L 和 -Wl,-rpath 选项指定同一目录两次。

【讨论】:

    【解决方案2】:

    链接器在其配置的路径中查找 libcurl 并首先找到旧版本。

    编辑 /etc/ld.so.conf 以使链接器在具有新 libculr 版本的目录中查找。

    或者重新安装libcurl:

    sudo apt-get remove libcurl
    wget http://curl.haxx.se/download/curl-7.56.0.tar.gz
    ./configure
    make
    make install
    

    【讨论】:

    • 不要将软件开发和系统管理混为一谈。无需触摸系统安装的软件即可开发自己的软件。
    • 你应该。这对于 libcurl 来说尤其重要,因为它有无数的构建时间配置参数和可选的依赖项。您不希望最终得到一个 curl 突然无法执行 ssl 或 ftp 或 kerberos 或 ... 的系统
    • 我已经考虑过了。在我看来,开发人员应该具备基本的管理技能。它可以减少依赖并更快地解决问题。
    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 2019-09-05
    • 2011-09-19
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多