LNK2005:找到用/ MT构建的模块

时间:2012-02-10 13:44:12

标签: c++ nmake mapserver lnk2005 mt

我正在尝试构建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选项引起的,当它们因项目而异。

我检查了所有项目的构建文件,但只发现了一个/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

2 个答案:

答案 0 :(得分:1)

看看这个KB

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

根据您尝试的构建使用ignore libraries行。如果您使用的库需要该库,您将获得该库未找到的符号,您可以修复它。

此外,您可以使用dumpbin找出图书馆尝试链接的内容。

答案 1 :(得分: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

包含的makefile

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

我用

替换了它
CFLAGS= $(cflags) $(cdebug) $(noansi) -D_MD -MDd -I.

所有人都开始工作了。