2012-03-18 1 views
1

В настоящее время я пишу MEX-файл в MATLAB, который использует CPLEX API в C для решения задач линейного программирования.Ошибки компилятора для файла MEX, который использует API CPLEX

К сожалению, при запуске компиляции я столкнулся с «символом, не найденным для архитектуры x86_64», и я понятия не имею, как его решить. Я включил копию (MATLAB) ниже. Что мне нужно сделать для компиляции?

Есть также лоты компоновщика 'не удалось создать компактные раскручивающие ошибки, связанные с присвоением регистров и сохраненными. Так много, что я удалил 80% из них, чтобы сделать его более читаемым. Могут ли они быть связаны? Являются ли они поводом для беспокойства?

Некоторые другие сведения, которые могут быть полезны:

  • я могу скомпилировать yprime.c и другие файлы MEX, которые не использовать CPLEX API
  • Я использую MATLAB 2011b на Mac OSX 10.7.2
  • Я использую пакет GCC 4.2, входящий в XCode 4.2.
  • я уже применил патч XCode 4.2 для MATLAB

Вот (MATLAB) выход:

---------------------------------------------------------------- 
-> MATLAB    = /Applications/MATLAB_R2011b.app 
-> CC     = llvm-gcc-4.2 
-> CC flags: 
     CFLAGS    = -fno-common -no-cpp-precomp -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -fexceptions 
     CDEBUGFLAGS  = -g 
     COPTIMFLAGS  = -O2 -DNDEBUG 
     CLIBS    = -L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ 
     arguments   = -DMX_COMPAT_32 
-> CXX     = llvm-g++-4.2 
-> CXX flags: 
     CXXFLAGS   = -fno-common -no-cpp-precomp -fexceptions -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 
     CXXDEBUGFLAGS  = -g 
     CXXOPTIMFLAGS  = -O2 -DNDEBUG 
     CXXLIBS   = -L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ 
     arguments   = -DMX_COMPAT_32 
-> FC     = gfortran 
-> FC flags: 
     FFLAGS    = -fexceptions -m64 -fbackslash 
     FDEBUGFLAGS  = -g 
     FOPTIMFLAGS  = -O 
     FLIBS    = -L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -L -lgfortran -L -lgfortranbegin 
     arguments   = -DMX_COMPAT_32 
-> LD     = llvm-gcc-4.2 
-> Link flags: 
     LDFLAGS   = -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2011b.app/extern/lib/maci64/mexFunction.map 
     LDDEBUGFLAGS  = -g 
     LDOPTIMFLAGS  = -O 
     LDEXTENSION  = .mexmaci64 
     arguments   = -L/Users/berk/Applications/IBM/ILOG/CPLEX_Studio_Academic123/cplex/lib/x86-64_darwin9_gcc4.0/static_pic -lilocplex -lcplex 
-> LDCXX     = 
-> Link flags: 
     LDCXXFLAGS   = 
     LDCXXDEBUGFLAGS = 
     LDCXXOPTIMFLAGS = 
     LDCXXEXTENSION  = 
     arguments   = -L/Users/berk/Applications/IBM/ILOG/CPLEX_Studio_Academic123/cplex/lib/x86-64_darwin9_gcc4.0/static_pic -lilocplex -lcplex 
---------------------------------------------------------------- 




-> llvm-gcc-4.2 -c -I/Users/berk/Applications/IBM/ILOG/CPLEX_Studio_Academic123/cplex/include/ -I/Applications/MATLAB_R2011b.app/extern/include -I/Applications/MATLAB_R2011b.app/simulink/include -DMATLAB_MEX_FILE -fno-common -no-cpp-precomp -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -fexceptions -DMX_COMPAT_32 -g "addcutsmx.c" 

-> llvm-gcc-4.2 -g -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2011b.app/extern/lib/maci64/mexFunction.map -o "addcutsmx.mexmaci64" addcutsmx.o -L/Users/berk/Applications/IBM/ILOG/CPLEX_Studio_Academic123/cplex/lib/x86-64_darwin9_gcc4.0/static_pic -lilocplex -lcplex -L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ 

ld: warning: could not create compact unwind for _CPXLmsg: register 12 saved somewhere other that in frame 

ld: warning: could not create compact unwind for _CPXsetbranchcallbackfunc: register saved more than once (might be shrink wrap) 

Undefined symbols for architecture x86_64: 
    "_kCFAllocatorDefault", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_kIOMasterPortDefault", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_IOServiceMatching", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_IOServiceGetMatchingService", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "___CFStringMakeConstantString", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_IORegistryEntryCreateCFProperty", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFGetTypeID", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFStringGetTypeID", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFStringGetCString", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFDataGetTypeID", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFDataGetLength", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFDataGetBytePtr", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_CFRelease", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
    "_IOObjectRelease", referenced from: 
     _ilm_fun_000 in libcplex.a(env.o) 
     _ilm_fun_121 in libcplex.a(env.o) 
     _ilm_api_004 in libcplex.a(env.o) 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

mex: link of ' "addcutsmx.mexmaci64"' failed. 

Error using mex (line 206) 
Unable to complete successfully. 

Устранена:

Для дальнейшего использования, предупреждающие сообщения являются не проблема при использовании CPLEX. Фактической проблемой были отсутствующие символы, которые обычно входят в рамки CoreFoundation и IOKit, которые включены в XCode 4.2. Обычно их можно включать с помощью фреймворков CoreFoundation и -framework IOKit, но команда mex в MATLAB не поддерживает эту функцию. К счастью, однако, вы можете добавить флаги на основе данных для процесса связывания, используя LDFLAGS = '\ $ LDFLAGS -framework CoreFoundation -framework IOKit' ...

ответ

1

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

Однако в этом случае недостающие символы кажутся вещами, которые, как вы ожидали бы, определялись бы какой-то стандартной библиотекой. (Префикс _ и __ предлагает это). В этом случае вам нужно добавить правильную библиотеку в путь поиска компоновщика, используя опцию -l. В вашем related post опция -lcplex сделала именно это для библиотеки cplex, которая затем позволила компоновщику найти недостающие функции CPLEX.

Я не признаю конкретные символы, но есть вероятность, что поиск с помощью google поможет найти нужные библиотеки. В качестве отправной точки, согласно this somewhat dated post, некоторые из недостающих символов являются символами CoreFoundation (MACOSX), которые вы должны найти в одной из папке/Library/Frameworks.

Существует также вероятность того, что библиотеки CPLEX были построены с использованием другой (более старой?) Версии файлов OSX. Если это так, вы можете искать обновленные (Lion specific?) Библиотечные файлы из CPLEX и/или видеть, имеет ли MATLAB/gcc опцию обратной совместимости для принудительного использования устаревших фреймворков OSX.

Надеюсь, это поможет.

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

  • Нет связанных вопросов^_^