2007年7月24日

LINK : warning LNK4098

VCで他のLibをリンクするとこんなメッセージが出る。

LINK : warning LNK4098: defaultlib "msvcrtd.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
LINK : warning LNK4098: defaultlib "nafxcwd.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
LINK : warning LNK4098: defaultlib "libcmtd.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください

よく、「スタティックライブラリでMFCを使用」と出ていたので、「共有DLLでMFCを使用」に変更していたが、ここでなぜ出るか少しだけ調べて見る。

ランタイムライブラリがVisualStdioでシングルスレッド、マルチスレッド(DLL)、マルチスレッドで3種類。デバッグ、リリース版で計6種類用意されている。

ちなみに、
  • MSVCRT.lib マルチスレッド(DLL) Release /MD(コンパイルオプション)
  • MSVCRTd.lib マルチスレッド(DLL) Debug /MDd
  • LIBCMT.lib マルチスレッド Release /MT
  • LIBCMTd.lib マルチスレッド Debug /MTd
  • LIBC.lib シングルスレッド Release /ML
  • LIBCd.lib シングルスレッド Debug /MLd
となっている。
コンパイラーオプションは、「プロジェクトの設定」→タブ「C/C++」→カテゴリ「コード生成」で確認できる。

ライブラリで作成したときにリンクしたランタイムライブラリと現在のアプリで使用しているランタイムで異なっているためにエラーが出ているようだ。

ライブラリのソースコードがあれば、コンパイルオプションをアプリと同じオプションに変え作成しなおせば直りそうです。しかし、ソースコードがなければ、ライブラリのオプションにアプリを合わせないとだめかぁ。。。しかし、アプリが「マルチスレッド」、ライブラリが「マルチスレッド(DLL)」の場合、警告は出るが、使えるぽいが。


これを知ってからは、ライブラリを用意する場合には、一応全部のライブライを用意するようにしています。
\md\hoge.lib
\mdd\hoge.lib
\mt\hoge.lib
\mtd\hoge.lib
って感じで。

あと、使う側で、「プロジェクトの設定」→タブ「リンク」→カテゴリ「インプット」で
「オブジェクト/ライブラリモジュール」hoge.lib
「追加するライブラリのパス」.\md\とか\mt\
とか入力しています。「追加するライブラリのパス」ではdebugとreleaseでデバッグ版かリリース版かを切替えられるようにしています。

人気blogランキングへ にほんブログ村 IT技術ブログへ ブログランキング ドット ネット

0 件のコメント: