Ошибки компилятора для файла MEX, который использует CPLEX API

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

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

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

Некоторая другая информация, которая может быть полезна:

  • Я могу скомпилировать yprime.c и другие файлы MEX, которые не используют API CPLEX.
  • Я использую 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. Обычно их можно включать с помощью флагов -framework CoreFoundation и -framework IOKit, но команда mex в MATLAB не поддерживает эту функцию. Однако, к счастью, вы можете добавить собственные флаги для процесса связывания, используя LDFLAGS='\$LDFLAGS -framework CoreFoundation -framework IOKit'...


person Berk U.    schedule 18.03.2012    source источник


Ответы (1)


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

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

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

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

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

person Bryan P    schedule 18.03.2012