【问题标题】:Calling matlab from C++从 C++ 调用 matlab
【发布时间】:2011-12-07 03:23:54
【问题描述】:

我试图从 .cpp 文件中调用 matlab。我使用以下命令编译 engdemo.cpp 其中包括 "engine.h"

g++ engdemo.cpp -I/usr/local/matlabR2010a/extern/include -L/usr/local/matlabR2010a/extern/lib -o engdemo

我得到的是以下内容:

engdemo.cpp:(.text+0xdb): undefined reference to `engOpen'
engdemo.cpp:(.text+0x12d): undefined reference to `mxCreateDoubleMatrix'
engdemo.cpp:(.text+0x143): undefined reference to `mxGetPr'
engdemo.cpp:(.text+0x175): undefined reference to `engPutVariable'
engdemo.cpp:(.text+0x189): undefined reference to `engEvalString'

...

collect2: ld 返回 1 个退出状态


我想这可能是一些链接问题,但我不确定。请帮帮我。非常感谢!

【问题讨论】:

标签: c++ matlab matlab-engine


【解决方案1】:

问题在于包含文件和文件夹(即库和链接文件)以及一些其他依赖项的指定不正确。

您可以使用一个简单的演示代码来连接 C/C++ 和 MATLAB 提供here,以便了解需要做什么。

您还需要为 MATLAB 使用具有合适设置的 CMAKELISTS.TXT 文件,here 提供了一个很好的教程。

【讨论】:

    【解决方案2】:

    这里有一个简单的 makefile 可以帮助您入门:

    生成文件

    # root directory of MATLAB installation
    MATLABROOT="/usr/local/matlabR2010a"
    
    all: engdemo
    
    engdemo:
        g++ ${MATLABROOT}/extern/examples/eng_mat/engdemo.cpp -o engdemo \
            -I${MATLABROOT}/extern/include \
            -L${MATLABROOT}/extern/lib -llibeng -llibmx
    
    clean:
        rm -f engdemo *.o
    

    只需调用make,然后以./engdemo 运行程序即可使用它


    您也可以直接从 MATLAB 内部编译它。首先确保您至少运行过一次mbuild -setup 命令:

    >> srcFile = fullfile(matlabroot,'extern','examples','eng_mat','engdemo.cpp');
    >> mbuild(srcFile, '-llibeng','-llibmx')
    >> !engdemo
    

    【讨论】:

    • Amro,非常感谢您的帖子。我尝试了两种方法,但似乎仍然存在问题。对于第一个,调用 make,我得到了这个“makefile:11: *** missing separator. Stop.”
    • 第二个,它说“/usr/local/matlabR2010a/extern/examples/eng_mat/engdemo.cpp: In function 'int main()': /usr/local/matlabR2010a/extern/示例/eng_mat/engdemo.cpp:113:警告:忽略 'char* fgets(char*, int, FILE*)' 的返回值,用属性 warn_unused_result /usr/bin/ld 声明:找不到 -llibeng collect2:ld 返回1 退出状态 mbuild: 'engdemo' 的链接失败。??? 错误使用 ==> mbuild at 193 无法成功完成。"
    • @lamothy:Makefile 需要一个前导制表符 (\t) 而不是空格 (` `) 来启动操作子句。如果您从上面复制/粘贴,SO 可能已将所有选项卡格式化为空格..
    • 我明白了。你绝对是对的。现在我得到的是以下 "-I"/usr/local/matlabR2010a"/extern/include \ -L"/usr/local/matlabR2010a"/extern/lib -llibeng -llibmx /usr/bin/ld: 找不到-llibeng collect2: ld 返回 1 退出状态 make: *** [engdemo] 错误 1"
    • @lamothy:你的安装可能有问题,也许你应该重新安装 MATLAB
    【解决方案3】:

    跟进what @Kurt S said,您需要包含库。这些是您需要的常见的:libeng.lib libmat.lib libmx.lib,但您可能需要其他的。

    因此您要添加链接选项-llibeng -llibmat -llibmx

    但你可能还需要其他人。

    【讨论】:

    • 感谢您的回复。我尝试了所有这三个链接选项,并且得到了所有相似的结果 /usr/bin/ld: cannot find -llibeng collect2: ld returned 1 exit status 如何找到所有链接选项?
    • 您还需要使用-L 选项将lib 路径设置为这些.lib 文件所在的位置
    • 谢谢。我猜我安装的 matlab 可能不完整。我需要先下载所有丢失的包。非常感谢您的帮助。
    • 因为我找不到任何 .lib 文件。 lib 文件夹几乎没有。
    • 这太令人惊讶了。您是否使用 Windows 中的搜索选项或 Unix/Linux 中的 find -name libeng.lib 搜索 libeng.lib
    【解决方案4】:

    您需要使用 g++ 的 -l 选项告诉它要链接哪些库。根据您的链接行,该库应位于 /usr/local/matlabR2010a/extern/lib 中。例如,如果您需要的库名为 libmatlab.a,则需要在命令行中添加 -lmatlab 选项。

    【讨论】:

    • 非常感谢您的回复。很抱歉,我不确定图书馆的名称。在 /usr/local/matlabR2010a/extern/lib 文件夹中,我发现了几个以 .map 结尾的文件。例如 MexLibrary.map。我应该在命令行中添加什么?
    • @lamothy:如果你不知道这些文件是什么,我们该怎么办?!
    • 嗨,Tomalak,我知道我的问题很幼稚。我是初学者,想在这里寻求帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多