2012-03-14 11 views
6

Zbudowałem biblioteki statyczne openCV 2.3. Mój projekt używa obecnie dynamicznych bez problemu, ale teraz chcę użyć statycznych bibliotek. I dodał bibliotekami do mojego .pro pliku:LNK2005 Błąd łączenia statycznych bibliotek openCV z Visual Studio i 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" 

i zawierają katalogi:

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

Kiedy próbuję zbudować otrzymuję te błędy:

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 

Każda pomoc lub sugestie doceniane .

Odpowiedz

9

Na CMake, przy budowaniu biblioteki OpenCV statyczne, oprócz odznaczając BUILD_SHARED_LIBS również niezaznaczone BUILD_WITH_STATIC_CRT, i że zadbał o tego konkretnego problemu

+2

+1. Wygląda na to, że wstępnie zbudowane statyczne biblioteki systemu Windows są zbudowane za pomocą statycznego CRT (/ MT). Jeśli twój projekt korzysta z dynamicznego CRT (/ MD), sam musisz odbudować OpenCV. –

+0

+1. Smutne ale prawdziwe. –

+0

Potwierdzona praca z OpenCV v3.1 też – M2X

1

Problem polega na tym, że linker próbuje połączyć różne, niekompatybilne wersje biblioteki uruchomieniowej Visual C++ (CRT) w jeden pojedynczy plik binarny.
Niech zgadnę na wolności: Każda część projektu i biblioteki, z którymi się łączysz, to NOT wygenerowane za pomocą tych samych opcji generowania kodu w Visual C++.
Zastanawiam się, czy przełącznik/NODEFAULTLIB 'd rozwiązać to wyzwanie?

+0

Czy istnieje inne rozwiązanie, aby to zrobić? Albo przebudowujesz openCV z określonymi flagami, albo zmieniasz opcje kompilacji na Qt Creator? Do budowania bibliotek OpenCV właśnie zbudowałem plik rozwiązania wygenerowany przez cmake, przy czym pole wyboru buduj biblioteki udostępnione jest niezaznaczone, co według mnie jest wszystkim, co musisz zrobić, aby uzyskać rozwiązanie dla statycznych bibliotek. A na Qt Creator z tego, co przeczytałem, to powinna być prosta sprawa importowania tych bibliotek? – jzepeda

+0

Tylko do celów testowych: Czy próbowałbyś skompilować swój projekt w trybie zwolnienia, zamiast trybu debugowania? – salomon

+0

Przez cały czas robiłem prasę. Debug daje mi błędy takie jak "opencv_core231.lib (drawing.obj): - 1: error: LNK2038: wykryto niedopasowanie dla '_ITERATOR_DEBUG_LEVEL': wartość '0' nie pasuje do wartości '2' w main.obj". Poniższe rozwiązanie naprawiło to dla mnie, chociaż podejrzewam, że będę musiał ponownie włączyć opcję (ponieważ wygląda na to, że QT nie jest statycznie połączona, a ja również chcę, aby mój redystrybucja była możliwa) – jzepeda

5

Upewnij się, że Projekt Ustawienia-> Konfiguracja Ustawienia-> C/C++> Generowanie kodu: biblioteka wykonawcza jest wielowątkowa (/ MT)

+0

to lub/MTd dla wersji debugowania – sastanin

Powiązane problemy