Можно ли загрузить разделяемую библиотеку C++ в Mathematica 8.0?

Я пытаюсь загрузить функцию C++, скомпилированную в общую библиотеку из Mathematica 8.0. Мне удалось использовать функцию C с использованием MathLink, но MathLink, похоже, не поддерживает функции C++. Поэтому я попытался создать общую библиотеку и загрузить ее через LibraryLink, но, похоже, LibraryFunctionLoad не может загрузить функцию C++. Кому-нибудь удалось использовать функцию C++ в Mathematica, и если да, то какие приемы нужно сделать, чтобы она работала?

1 ответ

Решение

Проблема в том, что C++ Код использует искажение экспортируемых символов.

Это кодирует пространство имен, имя класса, тип возвращаемого значения, имя и параметры как часть экспортируемого символа. Это означает, что функция называется:

int hello(int x, int y, int z)

экспорт как то так:

_Z5helloiii

Это было сделано на g++ на Linux, Windows имеет другую схему искажения.

Чтобы гарантировать, что функции экспортируются в C-совместимый способ, вы оборачиваете функцию в extern "C" механизм, который заставляет его экспортироваться в форме, совместимой с MathLink

поэтому вы используете следующее в шапке:

#ifdef __cplusplus
extern "C" {
#endif

int hello(int x, int y, int z);

#ifdef __cplusplus
}
#endif

До тех пор, как вы #include этот заголовок в вашем C++ реализация, это должно правильно связать с MathLink

Другие вопросы по тегам