undefined reference to 'cv::error(int, std::string const&, char const*, char const*, int)'
비주얼 스튜디오에서 안드로이드 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에서 문제가 생긴 것 같습니다.
댓글 영역