2012-04-10 21 views
9

我試圖在使用DMD 2.058的32位Ubuntu Linux(11.10 Ocelot)上使用std.net.curl。Linux中std.net.curl鏈接器錯誤

當我建(dmd source.d)我得到:

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticCtor30FZv': 
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticCtor30FZv+0x6): undefined reference to `curl_global_init' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticDtor31FZv': 
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticDtor31FZv+0x4): undefined reference to `curl_global_cleanup' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP4Impl6__dtorMFZv': 
std/net/curl.d:(.text._D3std3net4curl4HTTP4Impl6__dtorMFZv+0x12): undefined reference to `curl_slist_free_all' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP': 
std/net/curl.d:(.text._D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP+0x53): undefined reference to `curl_slist_append' 

[snip] 

我加-L-lcurl我的命令行(完整的命令:dmd source.d -L-lcurl),但我得到完全相同的結果。我安裝了libcurl4-openssl。我可以在這臺電腦上建立一個simple C curl程序而不會出現問題(gcc simple.c -lcurl)。我不知道從哪裏看這裏來弄清楚。

更新:這是根據dmd -v鏈接器是如何調用:

gcc source.o -o source -m32 -lcurl -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt 
+1

嘗試使用'-v'('dmd -v source.d -L -lcurl')運行以查看鏈接器是如何被調用的。 – kennytm 2012-04-10 19:30:18

+0

@KennyTM更新後的信息。 – eco 2012-04-10 19:41:05

回答

0

我想通了,如果我通過-v獲得連接器的命令,並重新排序,因此-lcurl是它鏈接沒有結束問題。

gcc source.o -o source -m32 -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt -lcurl 

我還是好奇,如果有一種方法可以解決這個問題,而無需手動運行鏈接器。

+2

對ld或gcc進行了更改,使得鏈接的參數順序非常重要,而有關依賴關係的內容也是如此。有一個很好的解釋,但似乎會導致這樣的問題。 – 2012-04-11 01:03:40

+1

是的,你可以這樣做:'dmd source.d -L-lphobos2 -L-lcurl'來修復鏈接器順序。 – 2013-01-02 12:09:56

5

正如你自己發現的,庫的順序不正確。來自的引用「GCC簡介」「調用另一個庫中定義的外部函數的庫應出現在包含該函數的庫之前。」在你的情況下,libphobos調用外部庫(libcurl)函數,所以我猜libphobos應該在libcurl之前。

該書可在線獲取。有關OT的章節在這裏:http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

+0

感謝您的鏈接。 – eco 2012-04-13 15:35:13

5

DMD編譯器在這方面明顯受到破壞。我發佈了一個修補程序來修復它(可能不是最好的),但編譯器的維護者並不相信這需要修復,所以沒有太多的討論。

+0

在Bugzilla上投票並在GitHub上發佈了對它的支持。它目前雖然失敗了autoteter。儘管如此,這位運動員最近遇到了麻煩,因爲這可能是由於頭部損壞。 – eco 2012-07-03 22:20:12

+0

它可能是補丁,它是爲D1完成的,而自動測試者只測試D2。應該是微不足道的適應,我從來沒有做過,因爲沒有興趣合併它,但如果利益在那裏,我會很樂意這樣做。 – 2012-07-03 23:39:45

+0

如果你沒有看到它,[這是一個討論](http://forum.dlang.org/thread/[email protected])關於我從新聞組獲得的問題。 – eco 2012-07-04 00:00:08

3

貌似在這個線程其他地方提到修復phobos2 /捲曲連接治安問題最簡單的方法,:

dmd source.d -L-lphobos2 -L-lcurl 

作品像一個魅力我。