5

いくつかの操作に依存するプロジェクトがありますlibiconv

Visual Studio 2008用にプリコンパイルされたバイナリを使用しiconv.libていましたが、Visual Studio 2010に移行する必要があり、プリコンパイルされたバイナリは使用できなくなりました。

自分でコンパイルすることにしましたが、libiconvドキュメントに記載されているように、MSVCコンパイラの公式サポートはありません。gccただし、バイナリインターフェイスがに残っている限り、MSVCコンパイラとバイナリ互換性のある静的ライブラリを生成できる場所を読みましたC。それはおかしなことに聞こえましたが、私はそれを試してみました、そしてそれは実際にほとんどうまくいきました。

私はそれをコンパイルし、名前を変更libiconv.aしてiconv.lib、リンクしようとしました。(これが悪い考えである場合は、私に知らせてください)。

最初にリンクエラーが発生しました:

1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk

いくつかの調査の後、フラグlibiconvを追加して(x86バージョンとx64バージョンの両方で)再コンパイルしました。-static-libgcc

それは機能しましたが、私のプログラムのx64リリースでのみ機能しました。x86リリースは常にまったく同じエラーで失敗します。

これを機能させるにはどうすればよいですか?

4

1 に答える 1

5

はい、これは可能です。厳密にCインターフェースとしてコンパイルすると、iconvはmsvcrt.libWindows Cランタイム(厳密にはC、glibcGCCで使用されるものに類似)であるにリンクするからです。GCCの通常のC++コンパイラを使用してビルドした場合、にリンクlibstdc++するVC ++とは異なる名前のマングルにリンクし、名前も付けられますmsvcr.dll

あなたの場合は、スタックオーバーフローをチェックするために各関数呼び出しに挿入される関数で__chkstkあるチェックスタック関数(Cランタイムの一部)です。これを「良い」方法で解決する方法はわかりませんが、iconvのビルドオプションを変更して、追加のコンパイラフラグを使用してビルドし、このチェックを抑制することができます。/Gs999999


ただし、私はVisual C ++ 2005/2008/2010を使用してlibiconvを構築し、その上に構築したソフトウェアは完全に機能しました(信頼性が必要な場合は、軍事機関で使用されるソフトウェア)。VC ++コンパイラを使用してビルドするのは少し面倒だったことを覚えていますが、それほど苦痛ではないはずです。

于 2010-11-24T14:39:05.697 に答える