undefined reference to 'cv::error(int, std::string const&, char const*, char const*, int)'

프로그래밍/OpenCV2019. 7. 1. 18:21

비주얼 스튜디오에서 안드로이드 apk용 so파일 파일을 만들기가 쉽지가 않네요.

에러를 하나 해결하면 다른 에러가 발생합니다.

이번에 볼 에러는 아래의 에러입니다.

 

1> undefined reference to 'cv::error(int, std::string const&, char const*, char const*, int)'
1> undefined reference to 'cv::error(int, std::string const&, char const*, char const*, int)'
1>clang.exe: error: linker command failed with exit code 1 (use -v to see invocation)
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Application Type\Android\3.0\Android.Common.targets(104,5): error MSB6006: "clang.exe"이(가) 종료되었습니다(코드: 1).
1>"ComputerVisionForAndroid2.vcxproj" 프로젝트를 빌드했습니다. - 실패
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========

 

범위를 좁혀가면서 디버깅 해보니.. 아래의 코드에서 문제를 발생시키고 있습니다.

double callCPP(Color32 **imageTest, int width, int height)
{
    using namespace cv;
    Mat matTest(height, width, CV_8UC4, *imageTest);
        
     ..생략..
}

 Mat matTest(height, width, CV_8UC4, *imageTest); 이 라인에서 에러를 발생시키는데 신기하게도

 Mat matTest(height, width, CV_8UC4); 로 수정하면 에러가 사라졌습니다.

 

문제의 정확한 원인을 찾을 수 없어서.. 디버깅 메시지를 더 보려고 했습니다.

 

clang.exe: error: linker command failed with exit code 1 (use -v to see invocation) 

 

위의 에러 메세지를 보면 호출을 보려면 -v를 쓰라고 합니다.

 

프로젝트의 속성 페이지 > C/C++ > 명령줄을 눌러 추가 옵션(D)란에 -v를 추가하고 확인 버튼을 누릅니다.

 

프로젝트의 속성 페이지 > 링커 > 명령줄을 눌러 추가 옵션(D)란에 -v를 추가하고 확인 버튼을 누릅니다.

음.. 그러면 빌드시 로그가 추가되긴 하는데 도움되는 정보는 없는 것 같네요.

오히려 -lm -lz를 입력하면 조금은.. 도움되는 로그가 나오는 것 같습니다.

 

1>ARM\Release\ComputerVisionForAndroid2.o: In function `Mat':
1>C:\Users\ddd\Downloads\opencv-4.1.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\include\opencv2/core/mat.inl.hpp:548: undefined reference to `cv::error(int, std::string const&, char const*, char const*, int)'
1>C:\Users\ddd\Downloads\opencv-4.1.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\include\opencv2/core/mat.inl.hpp:561: undefined reference to `cv::error(int, std::string const&, char const*, char const*, int)'
1>clang.exe: error: linker command failed with exit code 1 (use -v to see invocation)

 

인자가 4개인 Mat 생성자에서 cv::error를 사용하는데 cv:error가 정의된 곳을 못찾는 것 같네요..

 

libopencv_java4.so에 정의가 안되어 있단 말인가요..?

 

삽질을 하다가 해결방법을 찾았습니다.

 

OpenCV 공식 홈에서 4.1.0 버전이 아닌.. 3.4.6 버전의 안드로이드 파일들을 다운 받아서.. 프로젝트 설정에 설정하고 사용하면 됩니다.

 

왜 이런 문제가 생겼는지 궁금해서..  libopencv_java3.so와 libopencv_java4.so 파일 안에 정의된 함수들을 찾아봤습니다.

파일 중에서 문제와 관련된.. cv::error와 관련된 함수 정의를 찾아봤습니다.(맥에서 nm libopencv_java3.so 명령어 사용)

 

3.4.6버전과 4.1.0버전의 header파일에 정의된 cv::error에 대한 형태는 같으나(참고:OpenCV-android-sdk\sdk\native\jni\include\opencv2\core\base.hpp).. 실제로 so파일에 정의된 구조를 보면 모양이 좀 다르네요.

 

*header파일에 정의된 형태

CV_EXPORTS void error(int _code, const String& _err, const char* _func, const char* _file, int _line);

 

*libopencv_java4.so

T _ZN2cv5errorEiRKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPKcSA_i

 

*libopencv_java3.so

T _ZN2cv5errorEiRKNS_6StringEPKcS4_i

 

libopencv_java4.so에도 cv::error가 정의되어 있긴 하지만.. header파일에 정의된 형태와 달라서 linker에서 문제가 생긴 것 같습니다.

 

 

작성자

Posted by 드리머즈

관련 글

댓글 영역