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
чтобы выяснить, на что будет пытаться ссылаться библиотека.