9

DMD2.058を使用して32ビットUbuntuLinux(11.10 Ocelot)で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をインストールしています。このコンピューター上で問題なく簡単なCカールプログラムを作成できます( 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
4

4 に答える 4

5

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

于 2012-06-30T10:27:37.700 に答える
5

ご存知のように、ライブラリの順序は正しくありません。「GCCの概要」からの引用:「別のライブラリで定義された外部関数を呼び出すライブラリは、関数を含むライブラリの前に表示される必要があります。」あなたの場合libphobos、外部ライブラリの(libcurl)関数を呼び出すので、libphobos前に行く必要があると思いlibcurlます。

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

于 2012-04-11T17:16:05.047 に答える
3

このスレッドの他の場所で言及されているように、phobos2/curlリンカーの順序の問題を修正する最も簡単な方法のようです。

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

私にとっては魅力のように機能します。

于 2013-01-02T12:09:03.310 に答える
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

リンカを手動で実行せずにこれを修正する方法があるかどうか、私はまだ興味があります。

于 2012-04-10T22:16:44.053 に答える