C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74860] Re:Rad studio 10.1에서 3.3.1 버전 Opencv 사용하는 방법 질문.
빌더(TWx) [builder] 3896 읽음    2018-04-07 11:39
니시엔 님이 쓰신 글 :
: 우선 제 개발환경은 다음과 같습니다.
: OS: Win7 64bit,
: Tool : Rad Studio 10.1
: 사용하려는 Opencv 버전 : 3.3.1
: 컴파일 플랫폼 : 64bit
: 사용중인 언어 : C++
:
: 우선 64bit에서는 lib 파일을 add 하여도 활성화 되지 않기때문에 mkexp를 사용하여 opencv_world331.dll 을 opencv_world331.a파일로 변환 하여 사용하려고 합니다.
: Project option에서 Include path와 Library path 또한 Opencv3.3.1이 설치된 경로를 추가해 놓았습니다.
: Opencv 설치후 나오는 h,hpp 파일들을 수정한 부분은 없습니다.
: 아래는 현재 작성중인 cpp 소스입니다.
: //---------------------------------------------------------------------------
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit3.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
:
: #include <opencv2/opencv.hpp>
:
: TForm3 *Form3;
:
: using namespace cv;
: using namespace std;
:
: //---------------------------------------------------------------------------
: __fastcall TForm3::TForm3(TComponent* Owner)
:     : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm3::Button1Click(TObject *Sender)
: {
:     Mat image = imread(":D:\\Programs\\Test_20170707_113205_C001H001S0001000003.bmp");
: //    namedWindow( "window", WINDOW_AUTOSIZE );
:     imshow("window",image);
: }
: 위 소스를 컴파일 하면 다음과 같은 에러메세지가 나옴니다.
: [ilink64 Error] Error: Unresolved external 'cv::String::allocate(unsigned long long)' referenced from C:\USERS\HYKIM\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\OPENCV\WIN64\DEBUG\UNIT3.O
: [ilink64 Error] Error: Unresolved external 'cv::imread(cv::String const&, int)' referenced from C:\USERS\HYKIM\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\OPENCV\WIN64\DEBUG\UNIT3.O
: [ilink64 Error] Error: Unresolved external 'cv::String::deallocate()' referenced from C:\USERS\HYKIM\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\OPENCV\WIN64\DEBUG\PROJECT3.O
: [ilink64 Error] Error: Unresolved external 'cv::imshow(cv::String const&, cv::_InputArray const&)' referenced from C:\USERS\HYKIM\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\OPENCV\WIN64\DEBUG\UNIT3.O
: [ilink64 Error] Error: Unresolved external 'cv::Mat::deallocate()' referenced from C:\USERS\HYKIM\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\OPENCV\WIN64\DEBUG\UNIT3.O
:
: 무언가 제가 더 설정해줘야하는것이 있는 건가요?




답변:


엠바에서 제공하는 툴은 C External Linkage 속성을 갖는 DLL 임포트 파일에 대해서만 제한적으로
변환해 줄 뿐, C++ External Linkage 속성을 갖는 경우에는 변환을 하지 못합니다.

static 라이브러리의 경우에는 더욱 더 COFF와 OMF의 ABI 차이로 objconv 를 이용해도 변환이 불가능 합니다.

OMF 포맷의 static 라이브러리는 two-level hash 알고리즘을 이용해서 포함되는 오브젝트 파일들에 정의되어 있는
심볼들을 512바이트 크기의 블럭 페이지 마다 37개의 버킷 구조를 갖는 해쉬 테이블을 생성해서 넣게 되는데...

엠바 C++ 컴파일러가 사용하는 OMF 구조에서는 Public Linkage 속성을 Communal Name 속성으로 처리해서 따로
해쉬테이블에 넣지 않는 비표준적인 방식을 사용하기 때문에 objconv 를 이용해서는 변환이 불가능 하죠.

64비트의 경우에도 ABI 차이로 인해서 '64bit SEH' 구조가 다른데...
.pdata, .xdata 섹션에 생성되는 SEH 테이블이 ABI 가 달라서 (엠바툴은 itanium ABI 사용) objconv를 사용해도 변환이 불가능 합니다.

side load 구조로 사용이 가능하게 하려면 ABI 상이함을 묶어주는 링크 레이어가 필요하고 (버추얼 링커), 이걸 구현해서 상용화
해 볼 생각도 해보고는 있지만, 엠바 툴 사용자들이 워낙 없어서 상용화할 가치가 있을지 모르겠네요. 판로도 없이 개발시간 낭비?



+ -

관련 글 리스트
74851 Rad studio 10.1에서 3.3.1 버전 Opencv 사용하는 방법 질문. 니시엔 3254 2018/04/03
74881     Re:Rad studio 10.1에서 3.3.1 버전 Opencv 사용하는 방법 질문. 베도빈 4140 2018/04/13
74860     Re:Rad studio 10.1에서 3.3.1 버전 Opencv 사용하는 방법 질문. 빌더(TWx) 3896 2018/04/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.