2012-03-18 82 views
1

我目前正在使用C中的CPLEX API在MATLAB中編寫MEX文件來解決線性編程問題。使用CPLEX API的MEX文件的編譯器錯誤

不幸的是,當我嘗試編譯時遇到了一個「架構x86_64找不到的符號」的問題,我不知道如何解決它。我在下面包含了一個(MATLAB)輸出的副本。我需要做什麼才能成功編譯?

還有很多鏈接器'無法創建緊湊的展開'與寄存器分配和保存相關的錯誤。很多我刪除了80%,使其更具可讀性。這些有關係嗎?他們是否值得關注?

可能有幫助的其他一些信息:

  • 我可以編譯yprime.c等MEX文件不使用CPLEX API
  • 我使用MATLAB 2011B在Mac OSX 10.7.2
  • 我正在使用XCode 4.2中包含的GCC 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時不是問題。實際的問題是通常捆綁在XCode 4.2中包含的CoreFoundation和IOKit框架中的缺失符號。通常可以通過使用-framework CoreFoundation和-framework IOKit標誌來包含它們,但是MATLAB中的mex命令不支持該功能。然而,幸運的是,您可以使用LDFLAGS ='\ $ LDFLAGS -framework CoreFoundation -framework IOKit'爲鏈接過程添加基於自定義的標誌...

回答

1

基本問題是鏈接器,其工作是匹配代碼和共享庫的已編譯位之間的所有函數調用都無法找到創建完整可執行文件所需的某些功能。如果未定義的符號列表(缺失函數列表和其他缺失項目)包含您忘記寫入的函數的名稱,則需要編寫它。

但是,在這種情況下,缺失的符號似乎都是您希望由某種形式的標準庫定義的東西。 (_和__前綴暗示了這一點)。在這種情況下,您需要使用-l選項將正確的庫添加到鏈接程序的搜索路徑。在您的related post中,-lcplex選項爲cplex庫執行了該操作,然後允許鏈接程序查找缺失的CPLEX功能。

我不承認具體的符號,但機會是一點與谷歌搜索可以幫助您找到所需的庫。作爲起點,根據this somewhat dated post,一些缺失的符號似乎是CoreFoundation(MACOSX)符號,您應該可以在其中一個/ Library/Frameworks文件夾中找到這些符號。

CPLEX庫也有一些使用OSX文件的不同(較舊版本)版本構建的機會。如果是這種情況,您可以查看CPLEX更新的(Lion特定的?)庫文件,和/或查看MATLAB/gcc是否具有向後兼容性選項以強制使用較早的OSX框架。

希望這會有所幫助。