2016-02-01 5 views
0

Я пытаюсь создать mex-функцию в MATLAB. Функция зависит от библиотеки C++. Тем не менее, я получаю нерешенную внешность в MATLAB, независимо от того, что я делаю. Я создал три тривиальные файлы для демонстрации проблемы:Mex функционирует нерешенным внешним

my_test123.h

_declspec(dllexport) void my_test(); 

my_test.cpp

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

компилировать и связать эти два файла выше, используя команду :

cl /LD /Femy_test.dll my_test.cpp 

Это генерирует два файла: my_test.lib и my_test.dll.

Третий файл является тривиальным mexfunction:

my_mex.cpp

#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 my_mex.obj: ошибка LNK2019: неразрешенный внешний символ my_test ссылки в функции mexFunction my_mex.mexw64 : фатальная ошибка LNK1120: 1 неразрешенных внешнего

Я также попытался сделать каждый файл в C-файл (удаление экстернов и меняющееся расширение mexfunciton на .c) и компиляцию в C. Но я точно такую ​​же ошибку.

Я использую Visual Studio 2013 и 64-разрядную версию MATLAB 2014b.

Любая помощь очень ценится.

ответ

1

После многих часов работы на этом и помощь от линии поддержки MathWorks, я обнаружил следующее:

Вы должны принять несколько факторов во внимание:

  • Является ли ваш MATLAB 32 бит или 64 бит ?
  • Является ли расширение вашей mexfunction .c или .cpp?
  • Как вы используете внешний «C»?
  • Является ли DLL 64-разрядной .dll или 32-разрядной .dll?

Давайте предположим, что .dll является 32 бит .dll и MATLAB 32 бита

MEX функция является расширением .cpp, .dll является C++ .dll Вы дон Не нужно добавлять никаких extern «C» ни в my_test.cpp, ни в my_mex.cpp.

MEX функция имеет расширение .c, .dll является C++ .dll Вам нужно добавить «Экстерн "C" * в my_test.cpp.

MEX функция имеет расширение .cpp, .dll является C .dll Вам не нужно добавлять ехЬегп "C" к my_test.cpp но вам нужен в my_mex.cpp.

MEX функция имеет расширение .c, .dll является C .dll Вам не нужно объявление d any extern «C» ни в my_test.cpp, ни в my_mex.cpp.

Похоже, что в зависимости от расширения файла функции mex MATLAB компилирует его как C или C++-файл. Зная это, использование extern должно иметь смысл.

Все вышеизложенное по-прежнему действует, но для 64-битного MATLAB, но вам нужна 64-разрядная dll.

Смежные вопросы