MEX ошибка компиляции

0

Я собираюсь скомпилировать код c с mex для MATLAB 2013a 64 под win7 64

http://www.cs.cornell.edu/People/tj/svm%5Flight/svm_perf.html

Согласно информации с этого сайта, интерфейс SVMPerf MATLAB выполнялся O Luaces, но только для Linux и MACos, и он не компилируется под окнами

http://www.aic.uniovi.es/~oluaces/Oscars_Home_Page/Personal.html

для этого я установил gnumex для доступа к gcc для MATLAB, и это нормально.

затем я скомпилировал с помощью mex и создал объектные файлы для всех задействованных программ c в соответствии с созданием файла из SVMPerf.

Я также скомпилировал файл mex_interface.cpp, который использовался для интерфейса MATLAB под LINUX. Однако, когда я пытаюсь связать все файлы, я получаю следующую ошибку, связанную с my_malloc

svm_learn_main.obj:svm_learn_main.c:(.text+0x470): first defined here 
svm_struct_main.obj:svm_struct_main.c:(.text.startup+0x0): multiple definition of
'main' 
svm_learn_main.obj:svm_learn_main.c:(.text.startup+0x0): first defined here 
Cannot export mexFunction: symbol not defined 
mex_interface.obj:mex_interface.cpp:(.text+0x94): undefined reference to  
'my_malloc(unsigned long long)' 
mex_interface.obj:mex_interface.cpp:(.text+0x218): undefined reference to 
'my_malloc(unsigned long long)' 
C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.0/../../../../x86_64-w64-mingw32 
/bin/ld.exe: mex_interface.obj: bad reloc address 0x0 in section '.pdata' 
collect2.exe: error: ld returned 1 exit status 
link command: gcc -shared C:\Users\KRZYSZ~1\AppData\Roaming\MATHWO~1\MATLAB\R2013a  
\gnumex\mex.def -o svm_perf_classify.mexw64 -LC:\Users\KRZYSZ~1\AppData\Roaming
\MATHWO~1\MATLAB\R2013a\gnumex -s mex_interface.obj my_malloc.obj svm_learn_main.obj
svm_learn.obj svm_common.obj svm_hideo.obj svm_struct_learn.obj 
svm_struct_classify.obj svm_struct_common.obj svm_struct_main.obj svm_struct_api.obj   
svm_struct_classify.obj svm_struct_common.obj svm_struct_main.obj -llibmx -llibmex  
-llibmat 

Я считаю, что это указывает на этот код. my_malloc компилирует ОК. Есть идеи??

void create_argc_argv(const mxArray *options,int *argc,char **argv[]) {
// convert the matlab string of options into a CLI-like input (argc and argv)
*argc=1;

mwSize buflen = mxGetN(options)*sizeof(mxChar)+1;
char *buf = mxMalloc(buflen);
// Copy the string data into buf
mxGetString(options, buf, buflen);
// and separate in argv[]
char **ap, **argv_ptr=(char **)my_malloc(MAX_ARGVS*sizeof(char *));
argv_ptr[0]="OLR";
for (ap = (argv_ptr+1); (*ap = strsep(&buf, " \t")) != NULL;)
    if (**ap != '\0') {
        (*argc)++;
        if (++ap >= &argv_ptr[MAX_ARGVS])
            break;
    }
// 'buf' shouldn't be freed, since it is converted to the different 'argv[i]'
// by setting to '\0' the tabs and white spaces between options
// (this trick was taken from the 'strsep' man page)
// so, we don't make mxFree(buf);

*argv=argv_ptr;
}

моя команда mex выглядит так:

mex -largeArrayDims -DWIN -output svm_perf_classify mex_interface.cpp    
svm_learn_main.obj svm_learn.obj svm_common.obj svm_hideo.obj svm_struct_learn.obj 
svm_struct_classify.obj svm_struct_common.obj svm_struct_main.obj svm_struct_api.obj 
svm_struct_classify.obj svm_struct_common.obj svm_struct_main.obj
Теги:
mex

2 ответа

0
mex -largeArrayDims -DWIN -output svm_perf_classify mex_interface.cpp    

svm_perf_classify не имеет расширения исходного файла (.c,.cpp или другого), поэтому он считал исполняемый файл компилятором.

  • 0
    это имя выхода. Расширение зависит от версии ОС. Так что все в порядке здесь
0

Похоже, проблема у вас не связана с MEX, поскольку основная функция объявляется более одного раза. Это затрудняет компилятору знать, с чего начать запуск кода. Если у вас есть публичные функции, которые вы хотите использовать в svm_learn_main или svm_struct_main, вы захотите отделить их от файлов, содержащих основную функцию.

  • 0
    Хорошо, этот код компилировался нормально, поэтому множественные определения не были проблемой, я думаю. Я просто следовал за квитанцией из оригинального make-файла, который, я думаю, был в порядке
  • 1
    вот почему они появляются как ошибки связывания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню