2014-10-23 3 views
2

Я написал некоторые функции и создал dll с помощью кодов C++. & использовал некоторые файлы заголовков C++. Но я нашел LoadLibrary только поддерживает файлы заголовков C, и я получаю эту ошибку:loadlibrary и файлы заголовков C++

Error using loadlibrary (line 419) 
Failed to preprocess the input file. 
Output from preprocessor is:LargeBaseConvertorClass.h 
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\eh.h(26) : fatal error C1189: #error : "eh.h is only for 
C++!" 

Я не хочу изменить коды и я не хочу использовать MEX функции.

Как я могу использовать свою C++ dll в matlab? (Мне нужно много)

Спасибо.

Ya Ali.

+0

Показать команду MatLab использованный , пожалуйста. – KitsuneYMG

+0

loadlibrary ('e: /LargeBaseConvertorDll.lib', 'e: /LargeBaseConvertorClass.h') –

+0

На какой операционной системе? С какими командами? Пожалуйста, отредактируйте свой вопрос, чтобы улучшить его! –

ответ

0

Я сделал это в прошлом, создав несколько функций интерфейса C для создания и управления объектами C++. Это позволяет легко использовать код C++ из Matlab без необходимости его изменения. Пока заголовок только C, Matlab не жалуется, если объекты C++ создаются в конце.

Например, если класс вы хотите использовать из Matlab является:

class MyClass 
{ 
public: 
    double memberFunction(); 
}; 

Have быть заголовочный файл (добавить префикс, чтобы функции были экспортированы):

int createObject(); 
double callFunction(int object); 

Есть СРР файл будет примерно таким:

static std::map<int,MyClass*> mymap; 

int createObject() 
{ 
    MyClass* obj = new MyClass(); 
    int pos = mymap.size(); 
    mymap[pos] = obj; 
    return pos; 
} 

double callFunction(int obj) 
{ 
    return mymap[obj]->memberFunction(); 
} 

Теперь вы можете создавать объекты MyClass и получать доступ к членам из Matlab.

Вам нужно будет передать больше параметров, лучше обработать содержимое карты (проверьте, существует ли на карте объект и возвращают ошибки, если нет, удалять объекты с карты, когда это делается ... и т. Д.), Но это общая идея ,

2

Я сделал две вещи, чтобы справиться с этим раньше.

Во-первых, написать C-оболочку вокруг кода C++.

//foo_c_wrapper.h 
#ifndef FOO_C_WRAPPER_H 
#define FOO_C_WRAPPER_H 

#ifdef __cplusplus 
extern "C" { 
#endif 
typedef void* FOO_HANDLE;//can use a predeclared pointer type instead 
FOO_HANDLE init_foo(int a); 
void bar(FOO_HANDLE handle); 
void destroy_foo(FOO_HANDLE** handle); 
//ect 
#endif 

//foo.hpp 
#ifndef FOO_HPP 
#define FOO_HPP 
class Foo {public: Foo(int); ~Foo(); void bar();} 
#ifdef __cplusplus 
} 
#endif 
#endif 

//foo_c_wrapper.cpp 
#include "foo_c_wrapper.h" 
#include "foo.hpp" 
extern "C" { 
FOO_HANDLE init_foo(int a) {return new Foo(a);} 
void bar(FOO_HANLDE handle) { 
    Foo* foo = reinterpret_cast<Foo*>(handle); 
    foo->bar(); 
} 
void destroy_foo(FOO_HANDLE** handle) { 
    Foo** foo = reinterpret_cast<Foo**>(handle); 
    delete *foo; 
    *foo = NULL; 
} 
} 

Другой вариант заключается в том, чтобы развернуть создание пользовательского файла mex. К сожалению, эта тема слишком широка, чтобы вдаваться в подробности, так что я буду считать «Создание C++ Compatable Mex File» в качестве резюме по следующей ссылке:

http://www.mathworks.com/help/matlab/matlab_external/c-mex-file-examples.html#btgcjh1-14

+1

+1 определенно проще создать MEX-функцию для взаимодействия с библиотекой, особенно если это C++ не C (API MEX не так уж и сложен в использовании). Забудьте о 'loadlibrary' – Amro

+0

. Мои два цента - это то, что если вы пытаетесь сделать вашу библиотеку взаимообусловленной, тогда путь C может стоить ее в конечном итоге ... вам придется поддерживать оболочку в любом случае, может также поддерживать оболочку, которая позволяет вам взаимодействовать с кучей вещей. – IdeaHat

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