2012-03-18 3 views
1

現在C言語のCPLEX APIを使用して線形プログラミングの問題を解決するMATLABにMEXファイルを作成しています。CPLEX APIを使用するMEXファイルのコンパイラエラー

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

また、のロット番号リンカー 'レジスタの割り当てに関連するコンパクトアンワインドを作成できませんでした'というエラーがあり、保存されています。私が80%を削除して読みやすくしていたので、これらは関連していますか?彼らは懸念の原因ですか?役に立つかもしれません

いくつかの他の情報:

  • 私は、Mac OSX 10.7.2
  • に私はMATLABの2011Bを使用していますCPLEXのAPI
  • を使用していないyprime.cと他のMEXファイルをコンパイルすることができます
  • 私はXCode 4.2に含まれているGCC 4.2パッケージを使用しています。
  • Iはすでにここ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'を使用して、リンクプロセスのカスタムベースのフラグを追加することができます。

答えて

1

基本的な問題は、マッチアップあなたのコードと共有ライブラリのコンパイルされたビットの間のすべての関数呼び出しは、完全な実行可能ファイルを作成するために必要ないくつかの関数を見つけることができません。定義されていないシンボルリスト(欠落している関数や他の欠落している項目のリスト)に、書くのを忘れた関数の名前が含まれていた場合は、それを書き込む必要があります。

しかし、この場合、欠けている記号は、何らかの形の標準ライブラリによって定義されると思われるもののようです。 (_と__接頭辞はこれを示唆しています)。その場合は、-lオプションを使用してリンカーの検索パスに正しいライブラリを追加する必要があります。 related postでは、-lcplexオプションはcplexライブラリのためのものでした。これによりリンカは欠落しているCPLEX関数を見つけることができました。

私は特定のシンボルを認識しませんが、Googleを使用して周りを検索するチャンスは、必要なライブラリを見つけるのに役立ちます。開始点として、this somewhat dated postによれば、欠落しているシンボルの一部は、CoreFoundation(MACOSX)シンボルであるように見えます。このシンボルは、/ Library/Frameworksフォルダの1つにあります。

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

これが役に立ちます。

関連する問題