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

Mex函数未解析外部

  •  1
  • MrAliB  · 技术社区  · 9 年前

    我正在尝试在MATLAB中构建一个mex函数。该函数依赖于C++库。然而,无论我做什么,我都会在MATLAB中得到未解决的外部问题。我创建了三个简单的文件来演示这个问题:

    我的测试123.h

    _declspec(dllexport) void my_test();
    

    我的测试.cpp

    extern "C" {
    #include "my_test123.h"
    }
    void my_test() {
    }
    

    我使用以下命令编译并链接上述两个文件:

    cl /LD /Femy_test.dll my_test.cpp
    

    这生成两个文件, 我的测试库 我的测试.dll .

    第三个文件是一个普通的mexfunction:

    我的最大值

    #include "mex.h"
    
    extern "C" {
    void my_test(); 
    }
    
    /* The gateway function */
    void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
        my_test();
    }
    

    在MATLAB中,我使用以下命令:

    mex  -v my_mex.cpp my_test.lib
    

    我还试过:

    mex  -v my_mex.cpp -lmy_test.lib
    

    所有文件都在同一目录中,mex命令正在查找.lib文件(如果我尝试使用随机名称而不是my_test.lib,则会出现文件未找到错误)。

    我得到的错误是:

    使用mex时出错 正在创建库my_mex。lib和对象my_mex.exp 我的最大值。obj:错误LNK2019:函数mexFunction中引用的未解析外部符号my_test 我的最大值。mexw64:致命错误LNK1120:1个未解析的外部

    我还尝试过将每个文件都变成C文件(删除外部文件并将mexfunciton扩展名更改为.C)并用C编译,但我得到了相同的错误。

    我使用的是Visual Studio 2013和64位版本的MATLAB 2014b。

    任何帮助都非常感谢。

    1 回复  |  直到 9 年前
        1
  •  2
  •   MrAliB    9 年前

    经过几个小时的工作和MathWorks支持热线的帮助,我发现了以下几点:

    您需要考虑几个因素:

    • 你的MATLAB是32位还是64位?
    • 是mexfunction.c还是.cpp的扩展?
    • 您如何使用外部“C”?
    • .dll是64位.dll还是32位.dll?

    假设.dll是32位.dll,MATLAB是32位

    mex函数的扩展名为.cpp,.dll是C++.dll 你不需要添加任何 外部“C” 我的测试中也没有。cpp或my_mex.cpp中。

    mex函数具有扩展名.c,.dll是c++.dll 您需要在my_test.cpp中添加“extern”C“*。

    mex函数的扩展名为.cpp,.dll为.dll 你不需要添加 外部“C” 到my_test。cpp,但在mymex.cpp中需要一个。

    mex函数有一个扩展名.c,.dll是一个.dll 你不需要添加任何 外部“C” 我的测试中也没有。cpp或my_mex.cpp中。

    根据mex函数文件的扩展名,MATLAB将其编译为C或C++文件。知道这一点,外部用法应该是有意义的。

    以上所有内容仍然有效,但对于64位MATLAB,但您需要一个64位dll。