3

libgmpを使用するgnutlsサポートを使用してVLC(LinuxからWindowsへ)をクロスコンパイルしようとしています。libgmp (___gmpz_abs) のシンボルの複数の定義に対してリンク エラーが発生します。これは、 gnutlsのオブジェクト ファイルがそれぞれ独自のgmp関数の定義を持っているため、同じシンボルの複数の定義を持つ libgnutls.a にまでさかのぼります。複数定義されている関数は、libgmp がインライン化でトリッキーなことをしようとしている関数です。

私が知る限り、さまざまなコンパイラ、標準、およびプラットフォーム間のインライン化には多くのバリエーションがあります。libgmp はマクロを使用してこれをすべて適切に処理しようとしているようですが、失敗しています。最終結果は、gmp.h で定義されたインライン関数が、それを使用する gnutls のすべてのオブジェクト ファイルにコピーされることです。これらのオブジェクト ファイルを作成するために mingw が呼び出される実際のコンパイラ コマンド ラインを調べましたが、問題はありません。

libtool: compile:  i686-w64-mingw32-gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I./../../gl -I./../../gl -I./../includes -I./../includes -I./../../gl -I./.. -I./../minitasn1 -I/home/jeremy/vlc/contrib/i686-w64-mingw32/include -I/home/jeremy/vlc/contrib/i686-w64-mingw32/include -g -c mpi.c -o mpi.o

特に -std=gnu99 は、オンラインの他の場所での同様の問題の解決策として提案されましたが、明らかにこれはデフォルトで既に使用されています。

これが誰のせいなのか、mingw の libtool の gnutls または gmp のせいかは不明です。

私が答えなければならない質問は次のとおりです: インライン関数定義が適切に処理されるようにするには、どのフラグまたはオプションを使用して gnutls を構成または作成する必要がありますか?

4

2 に答える 2

1

これらの関数はインライン化されるはずですが、最適化を無効にしてライブラリをビルドしたように見えるため、インライン化されていません。

コンパイル (およびリンク) するときに -O2 を指定して再試行してください。

于 2013-03-04T17:43:01.857 に答える
0

私はあなたに肯定的な答えを提供することはできませんが、GCCマニュアルから...

関数定義での特定の使用法は、インライン置換に適さない場合があることに注意してください。これらの使用法には、可変長関数、alloca の使用、可変長データ型の使用 (可変長を参照)、計算された goto の使用 (値としてのラベルを参照)、非ローカル goto の使用、およびネストされた関数 (ネストされた関数を参照) があります。-Winline を使用すると、 inline とマークされた関数を代用できなかった場合に警告が表示され、失敗の理由が示されます。

いずれにせよ、インライン関数に関するそのセクションを読む価値があります

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

于 2013-03-05T09:13:23.140 に答える