6

アプリケーションをリンクしているときに、MFC VS6 プロジェクトで次のタイプのエラーが発生します。

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj)

私はそれが何を意味するか知っています(関数は2つの異なるライブラリに存在します); msvcrt.libそれを解決するには、2 つのライブラリ (または)のいずれかを除外する必要がありますlibc.lib

しかし、これを行うと、あらゆる種類の未解決の外部エラーが発生します。ですから、両方のライブラリを使い続けたいと思います。

_atoi関数を使用する場合と使用しlibc.libない場合msvcrt.lib(またはその逆)をリンカーに伝える方法はありますか?

どんな助けや指示も素晴らしいでしょう。

4

3 に答える 3

11

このエラーは、異なるランタイム ライブラリを使用してコンパイルされた 2 つのコードをリンクしていることを意味します。MSVCRT.dll は動的バージョンで、LIBC.lib は静的バージョンです。これを行うと、すべての地獄が解き放たれます。コードのどの部分がどのバージョンを使用しているかを調べて、これを整理してください。

于 2009-06-24T08:23:47.350 に答える
4

ランタイムの衝突があります。複数のランタイム ライブラリを使用することは、一般的に悪いことです。

リンカー オプションで /nodefaultlib:msvcrt (または /nodefaultlib:libc) を使用して、どちらか一方を除外できます。

実際、それに頼る前に、プロジェクトの設定を確認してください。私の記憶が正しければ、libc は VS6 のシングルスレッド ランタイムであり、msvcrt はマルチスレッド ランタイムです。ソリューションに複数のプロジェクトがある場合は、それらすべてがいずれかを使用していることを確認してください。

于 2009-06-24T08:28:43.240 に答える
1

次のようなエラーを無視するために使用できるオプションがあるようです: projectsettings > link > check 'Force file output' で。これにより、リンクエラーがあってもプログラムが生成されます。

ビルド出力は次のようになります。

msvcrt.lib(MSVCRT.dll): 警告 LNK4006: _atoi はすでに LIBC.lib(atox.obj) で定義されています。2 番目の定義は無視されます

もちろん、このオプションを使用すると、場合によっては動作しないアプリケーションが生成される可能性があるため、注意して使用する必要がありますが、ここではおそらく害はありません (願っています)。

他の回答に感謝しますが、それは私の特定のケースでは選択肢のようには見えませんでした.

于 2009-06-24T09:02:15.213 に答える