c - "Symbols not found for Architecture x86_64"对于在 C 中使用 CPLEX API 的 MEX 文件

标签 c matlab mex cplex

我目前正在 MATLAB 中编写一个 MEX 文件,它使用 C 中的 CPLEX API 来解决线性规划问题。不幸的是,当我尝试编译时遇到了“未找到体系结构 x86_64 的符号”问题,我不知道如何解决它。

一些基本信息:

  • 我可以编译 yprime.c 和其他不使用 CPLEX API 的 MEX 文件
  • 我在 Mac OSX 10.7.2 上使用 MATLAB 2011b
  • 我正在使用 XCode 4.2 中包含的 GCC 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.

最佳答案

您似乎缺少 -lcplex 或系统上 cplex 的相关链接说明。

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

来自 Using Cplex with Matlab它说你已经指定了完整的库链接路径和包含路径。根据您的操作,您可能还需要为 mex 指定 -lilocplex

例如mex -I/cplex_include_fullpath -L/cplex_library_fullpath -lcplex file.c

关于c - "Symbols not found for Architecture x86_64"对于在 C 中使用 CPLEX API 的 MEX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753510/

相关文章:

c - 传递给 mex 函数的数据是否保证无锯齿?

C解析HTTP Chunked传输编码响应

c - OpenMP 全局私有(private)变量

c++ - 不同于导出的 DLL 函数名称

MATLAB - 用小数字替换矩阵中的零

image-processing - 如何在matlab中对RGB矩阵执行power()函数

c++ - 变量改变应该不受影响(内存溢出?)

c - strcpy如何改变string的值

c - 从指针打印?

matlab - 定时器函数的错误处理