2015-01-12 2 views
0

I'trying для компиляции кода на C с Mex для MATLAB 2013a 64 под win7 64MEX ошибки компиляции

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

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

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

для этого я установил gnumex, чтобы иметь доступ к НКУ для 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 

ответ

0

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

+0

ну, этот код компилировался, так что несколько определений не были проблемой, я думаю. Я просто последовал за получателем из оригинального файла makefile, который, как мне кажется, был –

+1

, поэтому они появляются как связующие ошибки. – user3528438

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

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

+0

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

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