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 и восстановил его, но ошибка осталась.

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

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

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 ответа

Решение

The solution turned out very simple.

я бегу dumpbin on each library that main program uses. One of them was compiled with

/DEFAULTLIB:"LIBCMTD"

это означает /MT вариант.

PS It is interesting, that build file didn't contain /MT или же /MTd опции. Instead, it included

<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

The makefile contained

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

Я заменил его

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

and all begun to work.

Посмотри на эту КБ

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

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

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

Другие вопросы по тегам