与Mingw创建OpenCV 3.1的共享构建时,对cv::redirectError的未定义引用



程序和版本:Windows 10、带有gcc 6.1.0的Mingw32、Cmake 3.6.1(代码::blocks 16.01)

首先,我应该提到,构建静态构建确实非常有效,只是构建共享构建不起作用,而且我找不到解决特定问题的方法。

我尝试用上述程序作为共享构建构建OpenCV3.1。使用cmake的默认设置,我得到以下错误:

[ 34%] Linking CXX executable ....binopencv_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
modulescoreCMakeFilesopencv_test_core.dirbuild.make:885: recipe for target 'bin/opencv_test_core.exe' failed
mingw32-make[2]: *** [bin/opencv_test_core.exe] Error 1
CMakeFilesMakefile2: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

在我的情况下,默认设置意味着(除其他外):BUILD_TBB=关闭,BUILD_WITH_DYNAMIC_IPP=关闭,BUILD_opciv_world=关闭,ENABLE_OMIT_FRAME_PINTER=打开,ENABLE_SSE/SSE2/SSE3=打开,WITH_IPP和WITH_IPP_A=关闭(因为在某些情况下,当激活时,这似乎会导致常见问题)。

现在的问题是:这个错误意味着什么以及如何修复它

显然,缺少了一些功能:undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**)。在中搜索源代码给出了该函数的一些定义

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

但是未定义的引用想要一些int和char指针作为参数,但我在任何源文件中都找不到这样的函数。

当停用BUILD_EXAMPLES/PERF_TESTS/TESTS(如其他地方所建议的)时,这并不能解决问题,但稍后会出现相同的问题:

[ 95%] Linking CXX shared library ....binlibopencv_calib3d310.dll
CMakeFilesopencv_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**)'
CMakeFilesopencv_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
modulescalib3dCMakeFilesopencv_calib3d.dirbuild.make:787: recipe for target 'bin/libopencv_calib3d310.dll' failed
mingw32-make[2]: *** [bin/libopencv_calib3d310.dll] Error 1
CMakeFilesMakefile2: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

我没有发现任何关于此错误的错误报告或其他内容。

遇到了同样的问题。我已经解决了这个问题,在ts.cpp中用cvRedirectError替换了cv::redirectError,就像这个补丁之前一样

我修改了core/src/system.cpp中的redirectError()实现签名,使参数和返回值类型都使用ErrorCallback而不是CvErrorCallback,以匹配其声明签名。不知道为什么这很重要,因为这两个typedef看起来完全相同;尽管如此,它还是有所帮助。

最新更新