2012-02-24 30 views
1

私はVisual Studio 2010のプロジェクトでWindows用のCGALをビルドしようとしていますが、CGALにはGMPMPFRのライブラリが必要です。しかし、それらをlib + dllバンドルとして提供していますが、それらを単一の.libファイルの形で静的にコンパイルしたいと思っています。cygwinを使用してWindows用静的ライブラリを構築する

これで、GMPとMPFRをWindows下の静的ライブラリとして構築しようとしています。私はhereとしてこの目的のためcygwinを使用しています。 configuremakeに電話した後、.aの拡張子を持つlibsを出力して、.laファイルを追加しました。私はUnix用の静的ライブラリについてはあまり知らないので、別の拡張子を持つ.libと同じであることを示唆しました。私はそれを.libに変更し、私のプロジェクトにリンクしました。

最初の質問:そうだったのですか? .aと.libファイルは本当に同じですか?私はthisの質問を見ましたが、それが十分に役に立つとは思わなかった。その後

問題が発生した:私は

error LNK2019: unresolved external symbol ___getreent referenced in function ___gmp_default_reallocate 

を持っていたいくつかのcygwinの機能がgmp.libを結果にリンクされていないように思えます。私が見つけたhere、そのgetreentlibcygwin.aからエクスポートすることができます。そこで私はそれをlibcygwin.libにコピーし、私のプロジェクトにリンクしました。もちろん

error LNK2005: _strcpy already defined in libcygwin.lib(t-d001719.o) in libcmtd.lib(strcat.obj) 

、私はこのライブラリ内で宣言およびVisual Studioから1と競合してstrcpyように思えるしているものの機能とどのように知ることができない。驚くことではないが、私は次のエラーを受け取りました。私が実際に起こりたいのは、gmp.libがこの機能を静的にリンクするのに十分なほどスマートになるということです。したがって、

第2の質問:GMPにライブラリ依存関係を強制的にリンクさせる方法は? または cygwinを使わずにWindows用のGMPを正しくビルドするには?

答えて

1

更新:すべての問題(MPIR、GMP互換ライブラリ、およびVisual Studioを使用したMPFRを構築することができます)に対する答えは、MPIR project pageを参照してください。新しいMPIRのホームページはhereに位置していますが、私が知る限りMPFR情報はありません。


Cygwinは不要です。

あなたはBashシェルとMinGW(.org/-w64)が必要です。 cygwinコンパイラでビルドする場合、Cygwin DLLにリンクする必要があります.GGMPとMPFRの両方がMinGWによってビルド可能であるため、あなたのケースでは愚かです。

唯一のことは、どちらのライブラリもMSVCでビルド可能ではなく、MSVCはMinGWライブラリとリンクできないと考えています(プロジェクトの作者がDLLとインポートライブラリをバンドルした理由です)。 MinGW GCCですべてを構築するか、DLLを使用する必要があります。


以下は、GMPとMPFRのGCC静的ライブラリを構築するための手順です。

MinGW-w64 GCCを使用してWindows用GMPをビルドするには、MSYSが必要です。 C:\ Dev \ msys \ bin \ shのようにC:\ Dev \ msysのような場所に解凍してください。exeが存在します。

その後、あなたはMinGWの-W64 GCC必要があります:

を(私は、私の "個人的にはビルド" 特に4.6.3-1パッケージをお勧めします。 4.6.3-1-gcc_rubenvb.7zパッケージをダウンロードしてください。他のMinGWバンドルはこれを行うべきです)

C:\ Dev \ mingw64と解凍してC:\ Dev \ mingw64 \ b \ gcc.exe内に存在します。

C:\ Dev \ msys \ msys.batをダブルクリックします。タイプ:

export PATH=/c/Dev/mingw64/bin:$PATH 

Enterキーを押します。 、ディレクトリ* /あなたの/ home/USERNAMEにGMPとMPFRソースを解凍したディレクトリを構築します、とのconfigureのために使用することを忘れないでください:

--enable-static --disable-shared --prefix=/easytemplibinstalldir 

--host=i686-w64-mingw32 

と一緒に32ビットまたは

--host=x86_64-w64-mingw32 

64ビット。 GMPでも同じ値に設定された--buildが必要だと思います。設定が完了したら、makeと入力し、次にmake installと入力し、場合によってはmake checkの前に入力します。

/easytemplibinstalldir/libにlibgmp.aがあるはずです。 MPFRの場合、configure行に

--with-gmp=/easytemplibinstalldir 

を追加します。

libgmpとlibmpfrの両方を正しい順序で手動でリンクする必要があります。このために、Windowsでは自動依存関係のリンクはできません。

+0

MSVC(または何でも)がMinGW(または誰でも)で構築された.libをリンクできないことがありますか?私は.libはコンパイラに依存しないですが。 – Mikhail

+0

@Mikhailああ、そうじゃないよ。 MinGW GCCは '.a'ファイルを生成し、' .lib'は生成しません。 MSVCはGCCの出力形式については気にしませんが、なぜそれをリンクできるのでしょうか?一方、GCCはMSVCによって生成された32ビットの '.lib'ファイルにリンクすることができます。なぜなら、GCC/binutilsのいくつかの開発者はそれを可能にするのに十分気をつけていたからです。 – rubenvb

+0

Windows上で静的な.libにGMPを構築する方法があることを意味していますか?それはかなり混乱しています。なぜcygwinで作られたgmp.aファイルをMSVCにリンクできますか? – Mikhail

関連する問題