2

C ++プロジェクト(mapserver)をビルドしようとしています。それは他のいくつかのプロジェクトに依存します。

を実行する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

すべてのプロジェクトのビルドファイルを確認しましたが、が付いているファイルは1つだけでした/MT。に変更して/MD再構築しましたが、エラーが残りました。

ライブラリを見つける方法はこのエラーを引き起こしましたか?

全てに感謝!

PSプロジェクトリスト:

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

4

2 に答える 2

1

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

dumpbinメインプログラムが使用する各ライブラリで実行します。それらの1つはでコンパイルされました

/DEFAULTLIB:"LIBCMTD"

それは/MTオプションを意味します。

PS興味深いことに、ビルドファイルにオプションが含まれていませんでし/MT/MTd。代わりに、それは含まれていました

<win32.mak>

!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

含まれているmakefile

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

に置き換えました

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

そして、すべてが働き始めました。

于 2012-02-12T03:37:48.897 に答える
1

このKBを見てください

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

実行しようとしているビルドに基づいて、ライブラリを無視する行を使用します。使用しているライブラリがそのライブラリを必要とする場合、そのライブラリに対してシンボルが見つかりませんを取得し、それを修正できます。

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

于 2012-02-10T13:47:13.043 に答える