2

我正在尝试构建 C++ 项目(地图服务器)。这取决于其他一些项目。

当我运行时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并重建它,但错误仍然存​​在。

如何查找导致此错误的库?

谢谢大家!

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在主程序使用的每个库上运行。其中一个是用

/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

看看这个知识库

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

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

此外,您可以使用dumpbin来找出库将尝试链接到的内容。

于 2012-02-10T13:47:13.043 回答