1

現在、C の CPLEX API を使用して線形計画法の問題を解決する MATLAB で MEX ファイルを作成しています。

残念ながら、コンパイルしようとすると「アーキテクチャ x86_64 のシンボルが見つかりません」という問題が発生し、解決方法がわかりません。以下に (MATLAB) 出力のコピーを含めました。正常にコンパイルするにはどうすればよいですか?

レジスタの割り当てに関連して保存されたリンカーの「コンパクトなアンワインドを作成できませんでした」というエラーも多数あります。あまりにも多く、読みやすくするために 80% を削除しました。これらは関連しているのでしょうか?それらは懸念の原因ですか?

役立つ可能性のあるその他の情報:

  • CPLEX API を使用しない yprime.c およびその他の MEX ファイルをコンパイルできます。
  • Mac OSX 10.7.2 で MATLAB 2011b を使用しています
  • XCode 4.2 に含まれる GCC 4.2 パッケージを使用しています。
  • MATLAB 用の XCode 4.2 パッチを既に適用しています

(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 を使用する場合、警告メッセージは問題になりません。実際の問題は、XCode 4.2 に含まれる CoreFoundation および IOKit フレームワークに通常バンドルされているシンボルの欠落でした。通常、-framework CoreFoundation および -framework IOKit フラグを使用してそれらを含めることができますが、MATLAB の mex コマンドはこの機能をサポートしていません。ただし、幸いなことに、LDFLAGS='\$LDFLAGS -framework CoreFoundation -framework IOKit'... を使用して、リンク プロセス用のカスタム ベースのフラグを追加できます。

4

1 に答える 1

1

基本的な問題は、コードと共有ライブラリのコンパイル済みビット間ですべての関数呼び出しを一致させることを仕事とするリンカが、完全な実行可能ファイルを作成するために必要な関数の一部を見つけられないことです。未定義のシンボル リスト (不足している関数およびその他の不足している項目のリスト) に、書き忘れた関数の名前が含まれている場合は、それを記述する必要があります。

ただし、この場合、欠落しているシンボルはすべて、何らかの形式の標準ライブラリによって定義されると予想されるものであるように見えます。(_ および __ プレフィックスはこれを示唆しています)。その場合、-lオプションを使用して正しいライブラリをリンカの検索パスに追加する必要があります。関連する投稿では、-lcplexオプションはcplexライブラリに対してそれを行い、リンカが欠落しているCPLEX関数を見つけることを可能にしました。

特定のシンボルを認識できませんが、必要なライブラリを見つけるのに役立つ可能性があります。出発点として、このやや古い投稿によると、欠落しているシンボルの一部は CoreFoundation (MACOSX) シンボルのように見えます。これは、/Library/Frameworks フォルダーのいずれかで見つけることができるはずです。

また、CPLEX ライブラリが異なる (古い?) バージョンの OSX ファイルを使用して構築された可能性もあります。この場合、CPLEX から更新された (Lion 固有の?) ライブラリ ファイルを探したり、MATLAB/gcc に古い OSX フレームワークの使用を強制する下位互換性オプションがあるかどうかを確認したりできます。

お役に立てれば。

于 2012-03-18T23:43:00.397 に答える