Использование boost в библиотеке MATLAB MEX, отличается от версии MATLAB

Мы создаем несколько файлов MATLAB MEX, которые используют нашу коммуникационную библиотеку. Эта коммуникационная библиотека часто использует Boost. Теперь MATLAB также использует внутреннее повышение, что означает, что в стандартной настройке мы не можем использовать версию повышения, отличную от той, которая поставляется с MATLAB, или все, что происходит в ад.

Проблема в том, что буст-версия, которая поставляется с нашей эталонной версией matlab (boost 1.40), довольно старая и содержит несколько ошибок. Мы бы очень хотели использовать более новую версию.

Единственное решение, которое я вижу, — это создание собственной версии boost, которая живет в другом пространстве имен. Затем искажение имени должно предотвращать конфликты имен. Это решение немного сложнее, потому что boost также экспортирует некоторые символы «C» и содержит несколько макросов, которые нужно будет изменить.

Есть ли рекомендуемые решения, которые не требуют создания пользовательских версий буста?

11

Решение

Одно из решений состоит в том, чтобы изменить способ, которым matlab открывает ваш плагин, написав небольшой mex-файл загрузчика, который сам не зависит от boost, назовите его foo.mexglx

Это вызов mexFunction просто делает это

void mexFunction (int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[])
{
gMexEntry (nlhs, plhs, nrhs, prhs);
}

где переменная gMexEntry — это указатель на функцию, объявленный как

typedef void (*entryfunc_t)(int, mxArray**, int, const mxArray**);
entryfunc_t gMexEntry;

и заполняется статическим конструктором при загрузке модуля (все проверки ошибок для краткости игнорируются).

fh = dlopen ('bar.mexglx', RTLD_NOW | RTLD_DEEPBIND );
void * p = dlsym (fh, "mexFunction");
gMexEntry = reinterpret_cast<entryfunc_t> (p);

Цепочка событий заключается в том, что когда Matlab вызывает вашу функцию, тонкий упаковщик без зависимости boost откроет вашу функцию с зависимостью boost, используя RTLD_DEEPBIND вариант длопена, который поместит область поиска символов в этой библиотеке (используя вашу версию boost) впереди глобальной области видимости (используя старое повышение Matlab). Затем фактический вызов mexFunction будет перенаправлен на панель.

Если вы правильно соединяете cmdline, то, используя ‘ldd’, вы должны увидеть, что ‘foo.mexglx«не зависит от повышения, и»bar.mexglx‘имеет все ваши обычные зависимости.

Я интенсивно использую эту технику в течение нескольких месяцев без явных признаков отказа. У меня все еще есть некоторые небольшие опасения, что что-то, что я не понимаю, может пойти не так, но пока это единственное решение, которое у меня есть (кроме написания полного внепроцессного механизма выполнения, реплицирующего интерфейс mxArray и общение с помощью каналов или статическое связывание всего, что не подходит для моей ситуации)

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]