2012-03-14 13 views
6

Creé las bibliotecas estáticas de openCV 2.3. Mi proyecto actualmente usa los dinámicos sin problemas, pero ahora quiero usar libs estáticos. He añadido las librerias a mi archivo .pro:LNK2005 Error al vincular bibliotecas estáticas de OpenCV con Visual Studio y 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" 

e incluyen directorios:

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

Cuando intento para construir consigo estos errores:

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 

Cualquier ayuda o sugerencias apreciadas .

Respuesta

9

En CMake, cuando la construcción de las bibliotecas estáticas OPENCV, además desmarcando BUILD_SHARED_LIBS También BUILD_WITH_STATIC_CRT sin control, y que se hizo cargo de ese problema en particular

+2

+1. Parece que las bibliotecas estáticas de Windows preconstruidas están compiladas con CRT estático (/ MT). Si su proyecto utiliza CRT dinámico (/ MD), debe reconstruir OpenCV usted mismo. –

+0

+1. Triste pero cierto. –

+0

Confirmado el trabajo con OpenCV v3.1 también – M2X

1

El problema parece ser que el vinculador intenta combinar diferentes versiones incompatibles de la biblioteca de tiempo de ejecución de Visual C++ (CRT) en un único archivo binario.
Déjame adivinar en la naturaleza: cada parte de tu proyecto y las bibliotecas con las que te vinculas son NOT generadas con las mismas opciones de generación de código en Visual C++.
Me pregunto si el modificador/NODEFAULTLIB resolvería este desafío?

+0

¿Hay alguna otra solución para hacer esto? ¿Reconstruyendo openCV con banderas específicas o cambiando las opciones de compilación en Qt Creator? Para construir las librerías OpenCV, lo construí del archivo de solución generado por cmake, con la casilla de verificación de bibliotecas compartidas sin marcar, que a mi entender es todo lo que necesita hacer para obtener una solución para las librerías estáticas. Y en Qt Creator por lo que he leído, ¿debería ser una simple cuestión de importar esas libs? – jzepeda

+0

Solo para fines de prueba: ¿Intentaría compilar su proyecto en modo de lanzamiento, en lugar de modo de depuración? – salomon

+0

He estado haciendo lanzamientos todo el tiempo. Depurar me da errores como "opencv_core231.lib (drawing.obj): - 1: error: LNK2038: desajuste detectada para '_ITERATOR_DEBUG_LEVEL': el valor '0' no coincide con el valor '2' en main.obj". La siguiente solución me lo arregló, aunque sospecho que tendré que volver a activar la opción (porque parece que QT no está vinculado estáticamente, y también querré que mi proyecto sea redistribuible) – jzepeda

5

Asegúrese de que el Proyecto propiedades-> Configuración Properties-> C/C++> Generación de código: la biblioteca en tiempo de ejecución tiene varios subprocesos (/ MT)

+0

esto o/MTd para la compilación de depuración – sastanin

Cuestiones relacionadas