2016-07-24 27 views
1

Programme und Versionen: Windows 10, Mingw32 mit gcc 6.1.0, 3.6.1 Cmake, (Code :: Blocks 16.01)undefiniert Bezug auf cv :: redirectError während Shared-Build von OpenCV 3.1 mit Mingw Erstellung

Zunächst sollte ich erwähnen, dass das Erstellen eines statischen Builds einwandfrei funktioniert. Das Erstellen eines gemeinsamen Builds funktioniert nicht und ich finde keine Problemumgehungen für mein spezifisches Problem.

Ich habe versucht, OpenCV3.1 mit den oben genannten Programmen als Shared Build zu bauen. Die Verwendung von Standardeinstellungen des cmake, bekomme ich folgende Fehlermeldung:

[ 34%] Linking CXX executable ..\..\bin\opencv_test_core.exe 
../../lib/libopencv_ts310.a(ts.cpp.obj):ts.cpp:(.text$_ZN6cvtest2TS4initERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x119): undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**)' 
collect2.exe: error: ld returned 1 exit status 
modules\core\CMakeFiles\opencv_test_core.dir\build.make:885: recipe for target 'bin/opencv_test_core.exe' failed 
mingw32-make[2]: *** [bin/opencv_test_core.exe] Error 1 
CMakeFiles\Makefile2:1713: recipe for target 'modules/core/CMakeFiles/opencv_test_core.dir/all' failed 
mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2 
Makefile:159: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

Standardeinstellungen in meinem Fall bedeutet (unter anderem): BUILD_TBB = aus, BUILD_WITH_DYNAMIC_IPP = aus, BUILD_opencv_world = aus, ENALBE_OMIT_FRAME_POINTER = on, ENABLE_SSE/SSE2/SSE3 = on, WITH_IPP und WITH_IPP_A = off (dies scheint in einigen Fällen bei Aktivierung ein häufiges Problem zu verursachen).

Die Frage ist jetzt: Was bedeutet dieser Fehler und wie man es repariert?

Offensichtlich fehlt eine Funktion: undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**). den Quellcode der Suche gibt einige Definitionen dieser Funktion in

  1. system.cpp: Linie 662: redirectError(CvErrorCallback errCallback, void* userdata, void** prevUserdata)
  2. utility.hpp: Linie 174: CV_EXPORTS ErrorCallback redirectError(ErrorCallback errCallback, void* userdata=0, void** prevUserdata=0);

Aber die undefined reference will einige eine char-Zeiger als Parameter int , aber ich finde eine solche Funktion in keiner Quelldatei.

Beim Deaktivieren BUILD_EXAMPLES/PERF_TESTS/TESTS (wie woanders vorgeschlagen) dies das Problem nicht beheben, sondern gibt das gleiche Problem später:

[ 95%] Linking CXX shared library ..\..\bin\libopencv_calib3d310.dll 
CMakeFiles\opencv_calib3d.dir/objects.a(calibinit.cpp.obj):calibinit.cpp:(.text$_ZN2cv15findCirclesGridERKNS_11_InputArrayENS_5Size_IiEERKNS_12_OutputArrayEiRKNS_3PtrINS_9Feature2DEEE+0x426): undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**)' 
CMakeFiles\opencv_calib3d.dir/objects.a(calibinit.cpp.obj):calibinit.cpp:(.text$_ZN2cv15findCirclesGridERKNS_11_InputArrayENS_5Size_IiEERKNS_12_OutputArrayEiRKNS_3PtrINS_9Feature2DEEE+0x44d): undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**)' 
collect2.exe: error: ld returned 1 exit status 
modules\calib3d\CMakeFiles\opencv_calib3d.dir\build.make:787: recipe for target 'bin/libopencv_calib3d310.dll' failed 
mingw32-make[2]: *** [bin/libopencv_calib3d310.dll] Error 1 
CMakeFiles\Makefile2:3634: recipe for target 'modules/calib3d/CMakeFiles/opencv_calib3d.dir/all' failed 
mingw32-make[1]: *** [modules/calib3d/CMakeFiles/opencv_calib3d.dir/all] Error 2 
Makefile:159: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

ich sonst jeden Fehlerbericht, oder etwas gefunden havn't in Bezug auf diesen Fehler.

Antwort

2

Bekam das gleiche Problem. Ich habe es gelöst mit cv::redirectError mit cvRedirectError in ts.cpp ersetzt, wie es vor this patch war

+0

Ich musste auch '' calibinit.cpp'' auf die gleiche Weise (zweimal) ändern, aber dann kompiliert es ohne Fehler. Vielen Dank! – Phann

1

Was ich getan habe ist, ich redirectError() Umsetzung Unterschrift in Kern/src/system.cpp ErrorCallback für statt CvErrorCallback verändert sowohl ein Argument zu verwenden, und der Rückgabewerttyp, um seiner Deklarationssignatur zu entsprechen. Nicht sicher, warum das wichtig ist, da die beiden Schrifttypen identisch aussehen; Es hat trotzdem geholfen.