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 を構成または作成する必要がありますか?