使用 Mingw 创建 OpenCV 3.1 的共享版本时未定义对 cv::redirectError 的引用
Undefined reference to cv::redirectError while creating shared build of OpenCV 3.1 with Mingw
程序和版本:Windows10,Mingw32 with gcc 6.1.0,Cmake 3.6.1,(Code::blocks 16.01)
首先,我应该提到构建静态构建确实可以完美地工作,仅构建共享构建是行不通的,而且我没有找到解决我的特定问题的方法。
我尝试使用上述程序作为共享构建来构建 OpenCV3.1。使用 cmake 的默认设置,出现以下错误:
[ 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
我的默认设置意味着(除其他外):BUILD_TBB = 关闭,BUILD_WITH_DYNAMIC_IPP = 关闭,BUILD_opencv_world = 关闭,ENALBE_OMIT_FRAME_POINTER = 打开,ENABLE_SSE/SSE2/SSE3 = on,WITH_IPP and WITH_IPP_A = off(因为这似乎在某些情况下激活时会导致常见问题)。
现在的问题是:这个错误是什么意思,如何解决?
显然缺少某些功能:undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**)
。搜索源代码在
中给出了这个函数的一些定义
system.cpp
:第 662 行:redirectError( CvErrorCallback errCallback, void* userdata, void** prevUserdata)
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 ..\..\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
我没有找到任何错误报告或其他关于此错误的信息。
遇到同样的问题。我已经通过在 ts.cpp 中用 cvRedirectError
替换 cv::redirectError
解决了这个问题,就像之前 this patch
我所做的是更改 core/src/system.cpp 中的 redirectError()
实现签名,以使用 ErrorCallback
而不是 CvErrorCallback
作为参数和 return 值类型,以匹配其声明签名。不确定为什么这很重要,因为两个 typedef 看起来相同;尽管如此,它还是有所帮助。
程序和版本:Windows10,Mingw32 with gcc 6.1.0,Cmake 3.6.1,(Code::blocks 16.01)
首先,我应该提到构建静态构建确实可以完美地工作,仅构建共享构建是行不通的,而且我没有找到解决我的特定问题的方法。
我尝试使用上述程序作为共享构建来构建 OpenCV3.1。使用 cmake 的默认设置,出现以下错误:
[ 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
我的默认设置意味着(除其他外):BUILD_TBB = 关闭,BUILD_WITH_DYNAMIC_IPP = 关闭,BUILD_opencv_world = 关闭,ENALBE_OMIT_FRAME_POINTER = 打开,ENABLE_SSE/SSE2/SSE3 = on,WITH_IPP and WITH_IPP_A = off(因为这似乎在某些情况下激活时会导致常见问题)。
现在的问题是:这个错误是什么意思,如何解决?
显然缺少某些功能:undefined reference to `cv::redirectError(int (*)(int, char const*, char const*, char const*, int, void*), void*, void**)
。搜索源代码在
system.cpp
:第 662 行:redirectError( CvErrorCallback errCallback, void* userdata, void** prevUserdata)
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 ..\..\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
我没有找到任何错误报告或其他关于此错误的信息。
遇到同样的问题。我已经通过在 ts.cpp 中用 cvRedirectError
替换 cv::redirectError
解决了这个问题,就像之前 this patch
我所做的是更改 core/src/system.cpp 中的 redirectError()
实现签名,以使用 ErrorCallback
而不是 CvErrorCallback
作为参数和 return 值类型,以匹配其声明签名。不确定为什么这很重要,因为两个 typedef 看起来相同;尽管如此,它还是有所帮助。