2012-03-14 5 views
6

Я построил статические библиотеки openCV 2.3. Мой проект в настоящее время использует динамические без проблем, но теперь я хочу использовать статические библиотеки. Я добавил к моему LIBS .pro файл:LNK2005 Ошибка связывания статических библиотек openCV с Visual Studio и QT Creator

LIBS += "C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_calib3d231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_contrib231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_core231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_features2d231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_flann231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_gpu231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_haartraining_engine.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_highgui231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_imgproc231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_legacy231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_ml231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_objdetect231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_ts231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_video231.lib" 

И включают в себя: каталоги

INCLUDEPATH += "C:\Program Files\openCV_VS_static\opencv\build\include" 
INCLUDEPATH += "C:\Program Files\openCV_VS_static\opencv\build\include\opencv" 

Когда я пытаюсь построить я получаю эти ошибки:

LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" ([email protected]@YAXXZ) already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in MSVCRT.lib(MSVCR100.dll) 
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 

Любая помощь или предложения оценили ,

ответ

9

На CMake, при построении статических библиотек OpenCV, кроме убрав BUILD_SHARED_LIBS Я также непроверенную BUILD_WITH_STATIC_CRT, и позаботилась о конкретной проблеме

+2

+1. Похоже, что готовые статические библиотеки Windows построены со статическим CRT (/ MT). Если ваш проект использует динамический CRT (/ MD), вы должны самостоятельно перестроить OpenCV. –

+0

+1. Печально, но верно. –

+0

Подтверждена работа с OpenCV v3.1 тоже – M2X

1

Проблема заключается в том, что ваш компоновщик пытается объединить разные несовместимые версии библиотеки времени исполнения Visual C++ (CRT) в один отдельный файл.
Позвольте мне угадать в дикой природе: каждая часть вашего проекта и библиотеки, на которые вы ссылаетесь, - это NOT, сгенерированные с такими же вариантами генерации кода в Visual C++.
Интересно, может ли переключатель/NODEFAULTLIB решить эту проблему?

+0

Есть ли еще одно решение для этого? Либо перестроить openCV с помощью определенных флагов, либо изменить параметры сборки в Qt Creator? Для создания библиотек OpenCV я только что построил файл решения, созданный cmake, при этом флажок сборки разделяемых библиотек не установлен, что, насколько я понимаю, это все, что вам нужно сделать, чтобы получить решение для статических библиотек. И на Qt Creator из того, что я прочитал, должно быть, просто вопрос импорта этих библиотек? – jzepeda

+0

Только для целей тестирования: попытаетесь ли вы скомпилировать свой проект в режиме деблокирования вместо режима отладки? – salomon

+0

Я все время снимал. Debug дает мне такие ошибки, как «opencv_core231.lib (drawing.obj): - 1: ошибка: LNK2038: обнаружено несоответствие для« _ITERATOR_DEBUG_LEVEL »: значение« 0 »не соответствует значению« 2 »в main.obj». В приведенном ниже решении исправлено это для меня, хотя я подозреваю, что мне придется повторно использовать этот вариант (потому что он выглядит так, как QT не связан статически, и я также хочу, чтобы этот проект был распространен) – jzepeda

5

Убедитесь, что проект свойства-> Конфигурация свойства-> C/C++> Генерация кода: библиотека времени выполнения многопоточная (/ MT)

+0

это или/MTd для сборки отладки – sastanin