2012-03-17 103 views
1

我目前正在使用C中的CPLEX API编写MEX文件来解决线性编程问题。不幸的是,当我尝试编译时遇到了“架构x86_64中找不到的符号”问题,而我不知道如何解决它。“架构x86_64找不到的符号”对于使用CPLEX API的MEX文件C

的一些基本信息:

  • 我可以编译10.7.2
  • 我使用的是Mac OSX上yprime.c,并且不使用CPLEX API
  • 其他MEX文件,我使用MATLAB 2011B GCC 4.2包含在XCode 4.2中。
  • 我已经应用XCode 4.2 Patch for MATLAB

我将不胜感激任何意见的人可能有。我在下面列出详细的错误报告。

-> mexopts.sh sourced from directory (DIR = $PREF_DIR) 
    FILE = /Users/berk/.matlab/R2011b/mexopts.sh 
---------------------------------------------------------------- 
-> 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 -Wall 
     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   = 
-> LDCXX     = 
-> Link flags: 
     LDCXXFLAGS   = 
     LDCXXDEBUGFLAGS = 
     LDCXXOPTIMFLAGS = 
     LDCXXEXTENSION  = 
     arguments   = 
---------------------------------------------------------------- 

-> llvm-gcc-4.2 -c -I/Users/berk/Applications/IBM/ILOG/CPLEX_Studio_Academic123/cplex/include/ilcplex/ -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 -Wall -DMX_COMPAT_32 -O2 -DNDEBUG "addcutsmx.c" 

addcutsmx.c:488:4: warning: "/*" within comment 
addcutsmx.c:37: warning: 'free_and_null' declared 'static' but never defined 
addcutsmx.c:38: warning: 'usage' declared 'static' but never defined 
-> llvm-gcc-4.2 -O -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/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ 

Undefined symbols for architecture x86_64: 
    "_CPXLopenCPLEX", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLcreateprob", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLchgobjsen", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLnewcols", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLaddrows", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLlpopt", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLsolution", referenced from: 
     _mexFunction in addcutsmx.o 
    "_CPXLgetbase", referenced from: 
     _mexFunction in addcutsmx.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. 

回答

2

你似乎缺少-lcplex或您的系统上CPLEX相关联的指令。

用户手册指出正确的包含和链接参数位于cplex发行版的readme.html中,以及示例项目和makefile。

Using Cplex with Matlab它说你指定完整的库链接路径和包含路径。根据你在做什么,你可能还需要指定-lilocplex mex。

E.g. mex -I/cplex_include_fullpath -L/cplex_library_fullpath -lcplex file.c

+0

我必须在mex命令中包含-lcplex作为标志吗? 我确信我正确链接了头文件,因为当我在CPLEX API中不使用正确的变量类型时,编译器会吐出错误。这让我觉得我也必须链接一个库,尽管readme.html文件没有为C API指定一个库。 对不起,如果问题很愚蠢 - 我只是非常新的。 – 2012-03-17 23:13:36

相关问题