2017-10-05 305 views
4

我无法编译,我在Odroid-XU4板上使用Ubuntu。我该如何解决这个问题?谢谢你的帮助。未定义的libcurl函数引用

[email protected]:~/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 
[email protected]:~/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 
+0

也许您还安装了另一个libcurl版本,g ++在链接时会启动?它只会警告7.56.0中新增的API调用... –

+0

应该做什么?我需要删除所有版本并尝试安装libcurl 7.56.0? –

+0

你可以做到这一点;你也可以安装和构建你想要的版本的Curl源代码,但不安装它。然后让程序通过在新的Curl构建中指定它们的实际文件系统位置,为新的Curl版本选择标题和静态库。如果您需要从源代码构建,安装新Curl的问题在于,最终构建缺少SSL支持或其他有用功能的版本非常容易。如果你能从你的发行版中获得你想要的版本,那不太可能是个问题。但您的发行版可能没有该版本。 –

回答

0

链接器在其配置的路径中查找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 
+0

请勿混用软件开发和系统管理。无需触摸您的系统安装软件即可开发自己的软件。 –

+0

我会考虑你的建议,谢谢。 – boriaz50

+0

你应该。这对于libcurl尤其重要,因为它具有数十亿的构建时间配置参数和可选的依赖关系。你不想结束一个sysyem,卷曲突然不能做ssl或ftp或kerberos或... –

1
  1. 从源安装最新版本的卷曲。没有必要删除您现有的卷曲。默认配置会将安装置于/ 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选项指定两次相同的目录。