2012-02-10 41 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。我將其更改爲/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。其中之一是與

/DEFAULTLIB:"LIBCMTD" 

這意味着/MT選項。

P.S.有趣的是,構建文件不包含/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 

生成文件包含

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

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

取代它和所有開始工作。

1

看這個KB

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

使用忽略庫行根據您正在嘗試做的構建。如果您正在使用的庫需要該庫,則會爲該庫收到「找不到符號」,並且可以修復該庫。

另外,您可以使用dumpbin來了解庫將嘗試鏈接到的內容。