macOS에서의 헤더 및 C++ 컴파일 라이브러리 파일
이 예제에서는 clibPublishInterfaceWorkflow
를 호출하여 macOS®용 C++ 라이브러리 matrixOperations
에 대한 MATLAB 인터페이스를 만드는 방법을 보여줍니다. 이 예제의 경우 라이브러리는 헤더 파일 matrixOperations.hpp
및 동적 공유 라이브러리 파일 libmwmatrixOperations.dylib
에 의해 정의됩니다.
MATLAB®은 다음 폴더에서 이러한 파일을 제공합니다.
fullfile(matlabroot,"extern","examples","cpp_interface");
이 라이브러리에 대해 matrixlib
라는 인터페이스를 만들려면 워크플로 스크립트에서 라이브러리 정의 파일을 생성하고, 누락된 구문을 정의하고, 인터페이스를 빌드한 다음 인터페이스를 테스트하는 단계를 수행합니다. 퍼블리시 과정을 반복해야 하는 경우, 파라미터를 복원하고 별도 프로세스(out-of-process) 실행 모드를 활성화하기 위해 추가적인 단계를 수행할 수 있습니다. 그런 다음 퍼블리시된 인터페이스를 다른 사용자와 공유할 수 있습니다.
워크플로 스크립트 만들기
쓰기 가능한 폴더로 이동하고 clibPublishInterfaceWorkflow
를 호출합니다. 대화 상자에서 워크플로 스크립트의 이름을 지정합니다(예: publishmatrixlib.mlx
). 워크플로 스크립트에는 인터페이스 퍼블리시를 안내하는 단계가 들어 있습니다. 이 스크립트를 사용하여 인터페이스 퍼블리시를 위한 파라미터를 저장합니다. 모든 플랫폼에서 동일한 스크립트를 사용할 수 있습니다.
참고
워크플로 스크립트를 사용하면 여러 MATLAB 세션에서 인터페이스를 반복적으로 생성, 정의, 빌드, 테스트할 수 있습니다. 그러나 스크립트는 기존 정의 파일 덮어쓰기 옵션을 사용하여 다시 만든 라이브러리 정의 파일에 대한 편집 내용은 저장하지 않습니다.
Step 1: GENERATE
먼저, 라이브러리 정의 파일을 생성합니다. 워크플로 스크립트에는 이 단계에 대한 C++ 인터페이스 생성 라이브 편집기 작업이 포함되어 있습니다. 이 작업을 사용하여 라이브러리를 구성하는 파일을 선택하고 라이브러리 정의 파일을 생성하기 위한 옵션을 설정합니다.
파일 선택
라이브러리는 matrixOperations.hpp
헤더 파일과 libmwmatrixOperations.dylib
동적 공유 라이브러리 파일에 의해 정의됩니다. 라이브러리 유형은 디폴트 설정인 헤더 및 컴파일된 라이브러리 파일(Headers and compiled library files
)입니다.
라이브러리 시작 경로를 설정하려면 폴더 fullfile(matlabroot,"extern","examples","cpp_interface")
를 찾아 폴더 선택을 클릭합니다.
헤더 파일을 선택하려면 찾아보기를 클릭하여 파일 matrixOperations.hpp
를 엽니다.
헤더 파일은 cppshrhelp.hpp
헤더 파일에 종속되어 있습니다. 라이브러리 시작 경로의 폴더로 이동하고 폴더 선택을 클릭합니다.
컴파일된 라이브러리 파일을 선택하려면 Intel® 기반 macOS에 해당하는 maci64
폴더를 찾은 다음 libmwmatrixOperations.dylib
파일을 엽니다.
구성 선택
이 예제에서 C++ 컴파일러는 g++
로 설정되어 있습니다.
인터페이스 라이브러리 이름을 matrixlib
로 변경합니다. 이 이름은 MATLAB에서 라이브러리 기능을 호출하기 위해 clib
과 함께 사용됩니다. 예를 들어, 라이브러리 객체 Mat
를 만드는 경우 명령 프롬프트에서 다음을 입력합니다.
clib.matrixlib.Mat
출력 폴더가 쓰기 가능한 폴더인지 확인합니다.
인터페이스를 개발하는 동안 정의 파일을 다시 만들 수 있도록 기존 정의 파일 덮어쓰기 체크박스를 선택합니다.
결과 표시
기본적으로 정의 파일을 생성할 때 함수는 사용 가능한 구문(라이브러리의 클래스 및 함수)을 표시합니다. 인터페이스를 개발하는 동안 사용 불가능한 구문 표시 체크박스도 선택하십시오. 이를 통해, 지원되지 않기 때문에 포함되지 않은 구문이 뭔지 알 수 있습니다.
정의 파일 생성
Generate definition file을 클릭합니다. 스크립트가 진행률을 표시하고 지정된 출력 폴더에 라이브러리 정의 파일 definematrixlib.m
을 생성합니다.
Warning: Some C++ language constructs in the files for generating interface file are not supported and not imported. Using g++ compiler. Definition file definematrixlib.m contains definitions for 10 constructs supported by MATLAB. - 5 constructs are fully defined. - 5 constructs partially defined and commented out. To include the 5 undefined constructs in the interface, uncomment and complete the definitions in definematrixlib.m. To build the interface, call build(definematrixlib).
MATLAB Interface to matrixlib Library Class clib.matrixlib.Mat Constructors: clib.matrixlib.Mat(clib.matrixlib.Mat) clib.matrixlib.Mat() Methods: uint64 getLength() No Properties defined Functions clib.matrixlib.updateMatByX(clib.matrixlib.Mat,int32)
여러 세션에서 개발을 가능하게 하는 방법
인터페이스를 퍼블리시하는 동안 단계를 반복하거나 publishmatrixlib.mlx
스크립트를 닫았다가 다시 열거나 MATLAB을 다시 시작하는 경우가 있을 수 있습니다. 이러한 워크플로우를 수행할 때는 다음 섹션에 있는 지침을 따르십시오.
MATLAB 세션 간에 작업 공간 변수를 유지합니다. Restore library definition 섹션에서
outputFolderPath
변수를 출력 폴더 파라미터의 값으로 설정합니다.libraryNameForInterface
변수를 인터페이스 라이브러리 이름 파라미터matrixlib
로 설정합니다. 그런 다음 섹션을 실행합니다. 자세한 내용은 Restore Library Definition 항목을 참조하십시오.Enable out-of-process execution mode 섹션을 실행해 보십시오. 인터페이스를 개발하는 동안 이 모드를 사용하면 테스트하는 동안 MATLAB을 다시 시작할 필요가 없습니다. 라이브러리의 기능을 호출한 후 Unload out-of-process library 섹션을 실행하여 라이브러리를 언로드할 수 있습니다. 자세한 내용은 Load Out-of-Process C++ Library 항목을 참조하십시오.
Step 2: DEFINE
라이브러리 정의 파일을 생성했을 때 MATLAB에서 5개 구문이 부분적으로 정의되었다고 보고했습니다. 기능을 완전히 정의하려면 definematrixlib.m
파일을 편집하십시오. 파일을 편집하려면 DEFINE 섹션을 실행하십시오.
라이브러리 정의 파일을 스크롤하여 이 구문에 대해 주석 처리된 코드 블록을 찾습니다. MATLAB은 다음 함수에서 사용하는 인수의 크기를 자동으로 결정할 수 없습니다.
setMat
—Mat
클래스의 C++ 메서드getMat
—Mat
클래스의 C++ 메서드copyMat
—Mat
클래스의 C++ 메서드addMat
— C++ 함수updateMatBySize
— C++ 함수
matrixOperations
라이브러리의 도움말 문서를 바탕으로 인수 정의문에 <SHAPE>
의 값을 지정할 수 있습니다. 자세한 내용은 Define Missing SHAPE Parameter 항목을 참조하십시오.
각 구문에 대해 이 구문을 정의하는 명령문의 주석을 해제합니다.
<SHAPE>
인수를 다음 값으로 바꿉니다.구문
인수 이름
인수 C++ 정의
설명
<SHAPE>
를 대체할 값setMat
src
int [] src
행렬의 길이는 입력 인수
len
에 의해 정의됩니다."len"
getMat
RetVal
int const *
출력 인수의 길이는 입력 인수
len
에 의해 정의됩니다."len"
copyMat
dest
int * dest
dest
의 길이는 입력 인수len
에 의해 정의됩니다."len"
addMat
mat
Mat const * mat
이 함수는 단일
mat
인수를 받습니다.1
updateMatBySize
arr
int * arr
arr
의 길이는 입력 인수len
에 의해 정의됩니다."len"
정의 파일을 저장하고 닫습니다.
파일에서 편집한 내용을 확인하려면 Confirm edits and run summary 섹션을 실행합니다. 파일에서 보고된 오류를 모두 해결합니다.
summary
함수는 이제 인터페이스에setMat
,getMat
,copyMat
,addMat
,updateMatBySize
가 포함되어 있음을 보여줍니다.
MATLAB Interface to matrixlib Library Class clib.matrixlib.Mat Constructors: clib.matrixlib.Mat(clib.matrixlib.Mat) clib.matrixlib.Mat() Methods: setMat(clib.array.matrixlib.Int) clib.array.matrixlib.Int getMat(uint64) uint64 getLength() copyMat(clib.array.matrixlib.Int) No Properties defined Functions int32 clib.matrixlib.addMat(clib.matrixlib.Mat) clib.matrixlib.updateMatByX(clib.matrixlib.Mat,int32) clib.matrixlib.updateMatBySize(clib.matrixlib.Mat,clib.array.matrixlib.Int)
Step 3: BUILD
라이브러리에 대한 matrixlib
인터페이스를 빌드하려면 스크립트의 BUILD 섹션을 실행합니다.
Building interface file 'matrixlibInterface.dylib' for clib interface 'matrixlib'. Interface file 'matrixlibInterface.dylib' built in folder '/home/Documents/MATLAB/matrixlib'. To use the library, add the interface file folder to the MATLAB path. addpath('/home/Documents/MATLAB/matrixlib')
참고
생성, 정의, 빌드 단계를 반복할 수 있습니다. 그러나 라이브러리의 함수에 대한 도움말을 표시하거나 라이브러리의 함수를 호출한 후에는 동일한 MATLAB 세션에서 definematrixlib
정의 파일을 업데이트할 수 없습니다. MATLAB을 다시 시작하거나, 구성 선택 섹션의 인터페이스 라이브러리 이름 파라미터를 변경하여 새 정의 파일을 만드십시오.
Step 4: TEST
Set up and copy run-time libraries
Set up and copy run-time libraries 섹션을 실행합니다. 이 라이브러리에는 추가 런타임 종속 관계가 없으므로 명령을 수정하지 않아도 됩니다.
Enable out-of-process execution mode
정의 파일을 변경해야 하는 경우, MATLAB을 다시 시작할 필요가 없도록 이 명령을 실행하여 별도 프로세스(out-of-process)로 인터페이스 라이브러리를 호출하는 기능을 설정합니다. 자세한 내용은 Load C++ Library In-Process or Out-of-Process 항목을 참조하십시오.
Call help on interface library
인터페이스 라이브러리에 대한 도움말을 표시하려면 Call help on interface library 섹션을 실행합니다.
Write code to call and test interface library
Write code to call and test interface library의 코드 섹션을 사용하여 다음 테스트를 작성합니다.
matObj = clib.matrixlib.Mat; % Create a Mat object intArr = [1,2,3,4,5]; matObj.setMat(intArr); % Set the values to intArr retMat = matObj.getMat(5) % Display the values
retMat = read-only clib.array.matrixlib.Int with properties: Dimensions: 5 Resizable: 0
인터페이스 공유하기
다른 MATLAB 사용자와 인터페이스를 공유하려면 툴박스 설치(.mltbx
) 파일을 만듭니다. Distribute MATLAB Interface to C++ Library의 지침에 따라 다음을 수행하십시오.
툴박스 폴더를 인터페이스 파일
matrixlibInterface.dylib
가 포함된matrixlib
폴더로 설정합니다.컴파일된 라이브러리 파일
libmwmatrixOperations.dylib
를 동일한 폴더에 저장합니다.네임스페이스(호출 구문)를
clib.matrixlib
로 식별합니다.