2012-02-10 16 views
2

私はC++プロジェクト(mapserver)をビルドしようとしています。それは他のいくつかのプロジェクトに依存します。LNK2005:/ MTでビルドされたモジュールを見つける

私はnmakeを実行すると、それはこのような多くのエラーを示しています

... 
LIBCMTD.lib(getenv.obj) : error LNK2005: _getenv already defined in MSVCRT.lib(MSVCR90.dll) 
LIBCMTD.lib(tolower.obj) : error LNK2005: _tolower already defined in MSVCRT.lib(MSVCR90.dll) 
LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush already defined in MSVCRT.lib(MSVCR90.dll) 
MSVCRT.lib(MSVCR90.dll) : error LNK2005: __strnicmp already defined in LIBCMTD.lib(strnicmp.obj) 
... 

私は、彼らがプロジェクトからプロジェクトに異なる場合、それが/MD/MTオプションによって引き起こされる知っています。

すべてのプロジェクトのビルドファイルを確認したところ、/MTで1つしか見つかりませんでした。私は/MDに変更し、再構築しましたが、エラーは残りました。

ライブラリを見つける方法はこのエラーの原因ですか?

ありがとうございました!

P.S.プロジェクトリスト:

curl-7.24.0 
expat-2.0.1 
freetype-2.4.8 
gdal-1.9.0 
gdwin32 
jpeg-6b 
lpng158 
mapserver <-- main 
postgresql-8.4.9 
proj-4.7.0 
regex-0.12 

zlibの

答えて

1

解決策は非常に簡単でした。

メインプログラムが使用する各ライブラリでdumpbinを実行します。そのうちの1つは、

/DEFAULTLIB:"LIBCMTD" 

を意味し、/MTを意味します。

P.S.それは、ビルドファイルに/MTまたは/MTdオプションが含まれていなかったことは興味深いことです。代わりに、それは

!IFDEF NODEBUG 
cvarsmt = $(noansi) -D_MT -MT 
cvars  = $(cvarsmt) 
cvarsdll = $(noansi) -D_MT -D_DLL -MD 
!ELSE 
cvarsmt = $(noansi) -D_MT -MTd 
cvars  = $(cvarsmt) 
cvarsdll = $(noansi) -D_MT -D_DLL -MDd 
!ENDIF 

<win32.mak> 

を含むメイクファイルは、私は

CFLAGS= $(cflags) $(cdebug) $(noansi) -D_MD -MDd -I. 

でそれを置き換えると、すべてが動作し始め

CFLAGS= $(cflags) $(cdebug) $(cvars) -I. 

を含んでいました。

1

このKBを見

http://msdn.microsoft.com/en-us/library/6wtdswk0(v=vs.71).aspx

無視するライブラリを使用して、あなたがやろうとしているビルドをもとに並びます。使用しているライブラリにそのライブラリが必要な場合は、そのライブラリのシンボルが見つかりません。そのライブラリを修正することができます。

また、dumpbinを使用して、ライブラリがリンクしようとしているものを見つけることができます。

関連する問題