代码之家  ›  专栏  ›  技术社区  ›  Vahagn

如何从C++代码调用MATLAB?

  •  3
  • Vahagn  · 技术社区  · 14 年前

    我试图调用C++函数的MATLAB函数。

    在Matlab中,在/extern/examples/eng\u mat/engdemo.cpp中有一个这样的代码示例,但是我没有找到构建源代码的方法。

    下面是我使用的makefile:

    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
    

    (这里/opt/Matlab-2009a是我的Matlab根目录。)我得到了如下链接器错误:

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

    问题是:如何让g++编译engdemo.cpp?

    $ 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呢?

    3 回复  |  直到 12 年前
        1
  •  2
  •   SCFrench    14 年前

    假设$MATLABROOT是MATLAB的路径:

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

    如果添加-v开关,详细输出将显示用于编译引擎应用程序的命令。

        2
  •  0
  •   Drew Hall    14 年前

    你为什么要和我一起编译 -static ? 来自“曼恩gcc”:

    -静态

    换言之 选项强制链接器只考虑静态库,这意味着它将尝试查找 libmx.a 而不是 libmx.so

        3
  •  0
  •   xadu    10 年前

    在一个 tutorial 在MaWorkWork站点上发布了共享库的使用,用于从C++文件调用Matlab函数。这里,那个 mcc 命令用于创建共享库。

    随后 mbuild 命令用于构建可执行文件。但是,如果有一个复杂的C++代码,它本身需要一套自己的共享库来编译,MBug就不能工作。本教程没有演示在这种情况下需要做什么。所以,我回复的目的是发布解决方案。用户C++文件是VigEn.CPP,在这种情况下要链接的共享库是LIVEVILNET.SO,这是对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)。任何一种类型 mcrinstaller site .
    2. 完成此操作后,请确保设置 LD_LIBRARY_PATH 按照安装程序末尾的说明。
    3. 当前工作目录需要添加到LD\u LIBRARY\u路径。在bash中,我是通过 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD

    请注意,1&2在由生成的readme.txt文件中也有描述 电动机控制中心