LNK2005: найдите модуль, который был построен с / MT - PullRequest
2 голосов
/ 10 февраля 2012

Я пытаюсь построить проект 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 и перестроил, но ошибка осталась.

Как найти библиотеку, вызвавшую эту ошибку?

Спасибо за все!

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

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Решение оказалось очень простым.

Я запускаю 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.

и все начали работать.

1 голос
/ 10 февраля 2012

Посмотрите на это KB

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

Используйте строку игнорирования библиотек, основанную на сборке, которую вы пытаетесь сделать. Если используемая вами библиотека нуждается в этой библиотеке, вы получите Символ, не найденный для этой библиотеки, и вы можете это исправить.

Кроме того, вы можете использовать dumpbin, чтобы узнать, на что будет пытаться ссылаться библиотека.

...