2010-07-02 4 views
3

C++ 코드에서 Matlab 함수를 호출하려고합니다.C++ 코드에서 Matlab을 호출하는 방법은 무엇입니까?

Matlab에서는 /extern/examples/eng_mat/engdemo.cpp에서 이러한 코드의 예가 나오지만 소스 코드를 작성할 방법이 없습니다. 여기

은 내가 사용하는 메이크입니다 : (. 여기에/옵션/matlab에-2009a 내 매트랩 루트)

CFLAGS = -Wall -O3 

INCLUDES = -I/opt/Matlab-2009a/extern/include 

LIBRARIES = -Wl,-R/opt/Matlab-2009a/bin/glnx86 -L/opt/Matlab-2009a/bin/glnx86 -lmx -lmat -leng 

out : engdemo.cpp 
    g++ $(CFLAGS) $(INCLUDES) -static $^ $(LIBRARIES) -o out 

clean : 
    rm -f out 

나는이 같은 링커 오류가 점점 오전 :

/usr/bin/ld: cannot find -lmx 
collect2: ld returned 1 exit status 
make: *** [out] Error 1 

그리고 질문은 : eng ++.cpp를 컴파일하기 위해 g ++을 어떻게 만들 수 있습니까?

주, 공유 라이브러리가 존재 :

$ locate libmx.so 
/opt/Matlab-2009a/bin/glnx86/libmx.so 
/opt/Matlab-2009a/bin/glnx86/libmx.so.csf 

$ ldd /opt/Matlab-2009a/bin/glnx86/libmx.so 
    linux-gate.so.1 => (0x004b4000) 
    libut.so => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/libut.so (0x0078f000) 
    libmwfl.so => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/libmwfl.so (0x00110000) 
    libicudata.so.38 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/libicudata.so.38 (0xb7f82000) 
    libicuuc.so.38 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/libicuuc.so.38 (0x00bee000) 
    libicui18n.so.38 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/libicui18n.so.38 (0x001f7000) 
    libicuio.so.38 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/libicuio.so.38 (0x00e1c000) 
    libz.so.1 => /usr/lib/libz.so.1 (0x0098e000) 
    libstdc++.so.6 => /opt/Matlab-2009a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6 (0x00531000) 
    libm.so.6 => /lib/libm.so.6 (0x00194000) 
    libgcc_s.so.1 => /opt/Matlab-2009a/bin/glnx86/../../sys/os/glnx86/libgcc_s.so.1 (0x00eaa000) 
    libpthread.so.0 => /lib/libpthread.so.0 (0x00900000) 
    libc.so.6 => /lib/libc.so.6 (0x00345000) 
    librt.so.1 => /lib/librt.so.1 (0x00964000) 
    libdl.so.2 => /lib/libdl.so.2 (0x0014e000) 
    libexpat.so.1 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libexpat.so.1 (0x00152000) 
    libboost_thread-gcc42-mt-1_36.so.1.36.0 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libboost_thread-gcc42-mt-1_36.so.1.36.0 (0x00fc2000) 
    libboost_signals-gcc42-mt-1_36.so.1.36.0 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libboost_signals-gcc42-mt-1_36.so.1.36.0 (0x0017d000) 
    libboost_system-gcc42-mt-1_36.so.1.36.0 => /opt/Matlab-2009a/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libboost_system-gcc42-mt-1_36.so.1.36.0 (0x00a06000) 
    /lib/ld-linux.so.2 (0x001db000) 

그래서, 어떻게 g ++ engdemo.cpp를 컴파일 할 수 있습니까? 당신은 -v 스위치를 추가하면

$MATLABROOT/bin/mex -f $MATLABROOT/bin/engopts.sh engdemo.cpp 

이, 자세한 정보 출력이 명령은 엔진 응용 프로그램을 컴파일하는 데 사용되는 무엇을 보여줍니다 : $의 MATLABROOT 가정

+1

작동하는지 확인하십시오. http://www.mathworks.com/support/solutions/en/data/1-1BSZR/?solution=1-1BSZR, MEX 호출에 -v 옵션을 추가하십시오. 그러면 gcc/g ++ 호출에 대한 모든 명령 행 옵션이 표시됩니다. Makefile 항목에 대한 정보를 얻을 수 있습니다. –

답변

2

는 MATLAB의 경로입니다.

+0

답변을 주셔서 감사합니다. 특히 -v 옵션을 언급 해 주셔서 감사합니다. – Vahagn

0

-static으로 컴파일하는 이유는 무엇입니까? "남자 GCC"에서 : 동적 링크를 지원하는 시스템에

-static , 이것은 공유 라이브러리와 링크 방지 할 수 있습니다. 다른 시스템에서는이 옵션이 적용되지 않습니다. 즉

-static 옵션은이 libmx.a보다는 libmx.so 찾기 위해 노력할 것 즉, 정적 라이브러리를 고려하는 링커를 강제로. Matlab은 공유 (동적) 라이브러리에만 제공되기 때문에 실패합니다.

해당 옵션을 제거해보십시오. & 어떻게되는지보십시오.

작동하지 않는 경우 런타임시 .so 파일을 찾으려면 libtool을 실행해야 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. -static 옵션은 메이크 파일 복사 복사의 부작용입니다. 당신은 절대적으로 옳고, 그 옵션을 제거하면 코드가 컴파일됩니다. 그러나 SCFrench의 답변에서 볼 수 있듯이 g ++에 전달되어야하는 여러 개의 -D (매크로 정의) 옵션이 있습니다. – Vahagn

0

나는이 게시물을 미래에 우연히 발견하는 사람에게 관련이있을만한 것을 게시 할 것이라고 생각했다. C++에서 Matlab 함수를 호출하는 주제에 관한 것이다.

Mathworks 사이트에 게시 된 tutorial에는 C++ 파일에서 Matlab 함수를 호출하기위한 공유 라이브러리 사용이 설명되어 있습니다. 여기에서 mcc 명령은 공유 라이브러리를 만드는 데 사용됩니다.

그런 다음 mbuild 명령을 사용하여 실행 파일을 빌드합니다. 그러나 컴파일을 위해 자체 공유 라이브러리 집합이 필요한 복잡한 C++ 코드가 있으면 mbuild가 작동하지 않습니다. 이 자습서에서는이 경우 수행해야 할 작업을 보여주지 않습니다. 그래서, 내 답변의 목적은 그 해결책을 게시하는 것입니다. 사용자 C++ 파일은 vigenere.cpp이며이 경우 링크 될 공유 라이브러리는 libvigenere입니다.그래서, 이것은 결과 호출되는 g ++ :

g++ -o vigenere -L/usr/local/MATLAB/R2013b/runtime/glnxa64 -L. -I/usr/local/MATLAB/R2013b/extern/include/ vigenere.cpp -lmwmclmcrrt -lm -lvigenere 

일부 전제 조건 :

  1. matlab에 컴파일러 런타임 (MCR)를 설치해야합니다

    . Matlab 프롬프트에서 mcrinstaller을 입력하거나 Matlab site에서 해당 설치 프로그램을 다운로드하십시오.
  2. 이렇게 한 후 설치자 끝에있는 지침에 따라 LD_LIBRARY_PATH을 설정해야합니다.
  3. 현재 작업 디렉토리를 LD_LIBRARY_PATH에 추가해야합니다. bash는, 나는 1 & 2도 mcc 명령에 의해 생성 된 readme.txt 파일에 설명되어 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD

참고하여이 작업을 수행.

관련 문제