2017-10-05 141 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選項指定兩次相同的目錄。