В настоящее время я переношу некоторый код из Matlab в Octave. Некоторые из функций Matlab-кода используют Piotr's Computer Vision Matlab Toolbox (here), который включает в себя некоторые файлы mex. В Matlab, все работает как шарм, но когда я запускаю коды с Октавом, он выдает эту ошибку:Mex файл здание с Octave (выпуск с обертками)
error: 'imResampleMex' undefined near line 50 column 5
Однако все внутренние пути в пределах панели инструментов должны быть хорошими. Я понял, что путь Matlab и Octave обрабатывать MEX файлы разные, и пытался построить один из MEX файлов из функции C++ в октаву, как это:
mkoctfile --mex imResampleMex.cpp
Он терпит неудачу и бросает следующие сообщения об ошибках, связанных с C++ функция оберток:
In file included from imResampleMex.cpp:6:0:
wrappers.hpp:21:24: error: 'wrCalloc' declared as an 'inline' variable
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size);
^
wrappers.hpp:21:24: error: 'size_t' was not declared in this scope
wrappers.hpp:21:36: error: 'size_t' was not declared in this scope
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size);
^
wrappers.hpp:21:48: error: expression list treated as compound expression in initializer [-fpermissive]
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size);
^
wrappers.hpp:21:50: error: expected ',' or ';' before '{' token
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size);
^
wrappers.hpp:22:24: error: 'wrMalloc' declared as an 'inline' variable
inline void* wrMalloc(size_t size) { return malloc(size); }
^
wrappers.hpp:22:24: error: 'size_t' was not declared in this scope
wrappers.hpp:22:38: error: expected ',' or ';' before '{' token
inline void* wrMalloc(size_t size) { return malloc(size); }
^
wrappers.hpp: In function 'void wrFree(void*)':
wrappers.hpp:23:44: error: 'free' was not declared in this scope
inline void wrFree(void * ptr) { free(ptr); }
^
wrappers.hpp: At global scope:
wrappers.hpp:28:17: error: 'size_t' was not declared in this scope
void* alMalloc(size_t size, int alignment) {
^
wrappers.hpp:28:30: error: expected primary-expression before 'int'
void* alMalloc(size_t size, int alignment) {
^
wrappers.hpp:28:44: error: expression list treated as compound expression in initializer [-fpermissive]
void* alMalloc(size_t size, int alignment) {
^
wrappers.hpp:28:46: error: expected ',' or ';' before '{' token
void* alMalloc(size_t size, int alignment) {
^
imResampleMex.cpp: In function 'void resampleCoef(int, int, int&, int*&, int*&, T*&, int*, int)':
imResampleMex.cpp:21:39: error: 'alMalloc' cannot be used as a function
wts = (T*)alMalloc(nMax*sizeof(T),16);
^
imResampleMex.cpp:22:43: error: 'alMalloc' cannot be used as a function
yas = (int*)alMalloc(nMax*sizeof(int),16);
^
imResampleMex.cpp:23:43: error: 'alMalloc' cannot be used as a function
ybs = (int*)alMalloc(nMax*sizeof(int),16);
^
imResampleMex.cpp: In function 'void resample(T*, T*, int, int, int, int, int, T)':
imResampleMex.cpp:48:43: error: 'alMalloc' cannot be used as a function
T *C = (T*) alMalloc((ha+4)*sizeof(T),16); for(y=ha; y<ha+4; y++) C[y]=0;
^
warning: mkoctfile: building exited with failure status
файл wrappers.hpp выглядит так:
#ifndef _WRAPPERS_HPP_
#define _WRAPPERS_HPP_
#ifdef MATLAB_MEX_FILE
// wrapper functions if compiling from Matlab
#include "mex.h"
inline void wrError(const char *errormsg) { mexErrMsgTxt(errormsg); }
inline void* wrCalloc(size_t num, size_t size) { return mxCalloc(num,size); }
inline void* wrMalloc(size_t size) { return mxMalloc(size); }
inline void wrFree(void * ptr) { mxFree(ptr); }
#else
// wrapper functions if compiling from C/C++
inline void wrError(const char *errormsg) { throw errormsg; }
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size); }
inline void* wrMalloc(size_t size) { return malloc(size); }
inline void wrFree(void * ptr) { free(ptr); }
#endif
// platform independent aligned memory allocation (see also alFree)
void* alMalloc(size_t size, int alignment) {
const size_t pSize = sizeof(void*), a = alignment-1;
void *raw = wrMalloc(size + a + pSize);
void *aligned = (void*) (((size_t) raw + pSize + a) & ~a);
*(void**) ((size_t) aligned-pSize) = raw;
return aligned;
}
// platform independent alignned memory de-allocation (see also alMalloc)
void alFree(void* aligned) {
void* raw = *(void**)((char*)aligned-sizeof(void*));
wrFree(raw);
}
#endif
Я полагаю, мне нужно изменить этот файл, но мое знание C++ nx из mex-файлов, близких к несуществующим, я изо всех сил пытаюсь найти выход из этой горы ошибок. Я даже не знаю, иду ли я в правильном направлении или нет ... Любая помощь приветствуется!
Edit 1:
Я изменил мой файл wrappers.hpp добавление #include <stdlib.h>
к нему. Теперь создается файл mex. Однако, при выполнении функции вызова файла, теперь я получаю следующее сообщение об ошибке:
error: failed to install .mex file function 'imResampleMex'
error: called from
imResample at line 50 column 4
Возможно, версия 'mex.h' Matlab вытаскивает некоторые стандартные заголовки библиотеки C, которых нет в версии Octave. Попробуйте добавить '#include' в 'wrappers.hpp'. Это должно исправить ошибки 'size_t' и' free', не уверен, что все это исправит. –
Praetorian
@Praetorian Большое вам спасибо за ваш вклад! С этим добавлением создается mex-файл. Однако при запуске функции 'error: появляется ошибка: не удалось установить функцию .mex file 'imResampleMex''. Сейчас я редактирую свой вопрос. – Eskapp
Я не очень хорошо знаком с ароматом мегаполиса Октава, поэтому я, возможно, не смогу помочь в этом. Поиск Google предполагает, что что-то не так с вашим файлом mex, например, 'mexFunction' не экспортируется правильно? Вы знаете, определяется ли 'MATLAB_MEX_FILE'? Удостоверьтесь, что это так, поэтому 'mex.h' входит в комплект. Как только вы его определите, вы можете обнаружить, что вам даже не нужно «#include» –
Praetorian