2012-04-10 8 views
9

私は、DMD 2.058を使用して32ビットUbuntu Linux(11.10 Ocelot)でstd.net.curlを使用しようとしています。Linuxのstd.net.curlリンカーエラー

私は(dmd source.d)を構築すると私が手:私は、コマンドライン(フルコマンド:dmd source.d -L-lcurl)に-L-lcurlを追加

/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] 

が、私は正確に同じ結果を得ます。私は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

+0

@KennyTM情報と一緒に投稿を更新しました。 – eco

答えて

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に変更がありました。そのため、リンクするための引数の順序は、依存関係に関するものです。かなり良い説明がありましたが、ちょうどこのような問題を引き起こすようです。 –

+1

うん、あなたはできる: 'dmd source.d -L-lphobos2 -L-lcurl'リンカーの順序を修正する。 –

5

あなた自身が発見したように、ライブラリの順序は正しくありません。 からの引用 "GCC入門""別のライブラリで定義された外部関数を呼び出すライブラリは、関数を含むライブラリの前に現れます。"あなたのケースでは、libphobosは外部ライブラリの(libcurl)関数を呼び出します。したがって、libphoboslibcurlの前に移動する必要があります。

この本はオンラインで入手できます。 OTに関する章はここにあります:http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

+0

リンクをありがとう。 – eco

5

DMDコンパイラはこの点で明らかに壊れています。私はそれを修正するためのパッチを公開しましたが(おそらく最高のものではないかもしれませんが)、コンパイラのメンテナーは、これが全く修正される必要はないと確信していません。一見

+0

Bugzillaに投票し、GitHubでそのサポートを掲載しました。しかし、現在は自動テストに失敗しています。最近、オートテストが問題を抱えていましたが、HEADで何かが壊れている可能性があります。 – eco

+0

それはパッチであるかもしれません、それはD1のために行われ、autotesterはD2だけをテストします。適応するのは簡単なはずですが、私はそれをマージすることに興味がないので決して行っていませんが、興味があればそれをするのが喜ばしいでしょう。 –

+0

あなたがそれを見なかった場合は、私がニュースグループから得た問題についての[ここにある](http://forum.dlang.org/thread/[email protected]) 。 – eco

3

このスレッドで他の場所で述べたように、phobos2 /カールリンカ順序の問題を修正するための最も簡単な方法:のための魔法のように

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

ワークス私。

関連する問題