Ошибки компиляции для MEX-файла, который использует CPLEX API - PullRequest
1 голос
/ 19 марта 2012

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

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

1 Ответ

1 голос
/ 19 марта 2012

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

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

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

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

Надеюсь, что это такпомогает.

...