matlab - Matlab mex代码未使用生成文件未定义引用进行编译

  显示原文与译文双语对照的内容

我有一个 matlab mex扩展,我想使用Makefile编译它。 链接器似乎找不到mex库。 下面是 makefile:


MEXSUFFIX = mexa64
IX = mexa64
MATLABHOME =/usr/local/MATLAB/R2013b
MEX = g++
MEXCXX = echo
CXX = g++

CFLAGS = -fPIC -pthread -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fno-omit-frame-pointer -pthread -O3 -DNDEBUG

LIBS = -lm
INCLUDE = -I$(MATLABHOME)/extern/include -Icommon
#g++
MEXFLAGS = -shared -Wl,--no-undefined -Wl,-rpath-link,$(MATLABHOME)/bin/glnxa64 -L$(MATLABHOME)/bin/glnxa64 -lmx -lmex -lmat -lm

PROJECTS = residualfm
MEXDIR =.. 

all: $(PROJECTS)

residualfm: residualfm/functions.o
 $(MEX) $(MEXFLAGS) $(LIBS) -o $(MEXDIR)/$@.$(MEXSUFFIX) $^

.cpp.o:
 $(CXX) -c -o $@ $ <$(CFLAGS) $(INCLUDE)

clean:
 rm -f common/*.o
 for proj in $(PROJECTS); do 
 rm -f $$proj/*.o; 
 rm -f $(MEXDIR)/$$proj.$(MEXSUFFIX); 
 done

我的filestructure:


$ ls *
Makefile mex.kdev4 sfr_mex.sln sfr_mex.suo sfr_mex.v11.suo

residualfm:
DllMain.cpp residualfm_variant.def stdafx.h
functions.cpp residualfm_variant.vcxproj timing.cpp
functions.o residualfm_variant.vcxproj.user
maxflow_classic_boykov stdafx.cpp

以下是错误:


$ make
g++ -shared -Wl,--no-undefined -Wl,-rpath-link,/usr/local/MATLAB/R2013b/bin/glnxa64 -L/usr/local/MATLAB/R2013b/bin/glnxa64 -lmx -lmex -lmat -lm -lm -o.. /residualfm.mexa64 residualfm/functions.o
residualfm/functions.o: In function `mexFunction':
functions.cpp:(.text+0x27b): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0x2a0): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0x2c7): undefined reference to `mxGetClassID'
functions.cpp:(.text+0x2e5): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0x301): undefined reference to `mxGetNumberOfDimensions'
functions.cpp:(.text+0x320): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0x341): undefined reference to `mxGetData'
functions.cpp:(.text+0x350): undefined reference to `mxGetDimensions'
functions.cpp:(.text+0x371): undefined reference to `mxGetNumberOfElements'
functions.cpp:(.text+0x390): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0x3aa): undefined reference to `mxGetScalar'
functions.cpp:(.text+0x3c5): undefined reference to `mxGetNumberOfElements'
functions.cpp:(.text+0x3e4): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0x3fe): undefined reference to `mxGetScalar'
functions.cpp:(.text+0x4f5): undefined reference to `mexErrMsgTxt'
functions.cpp:(.text+0xdd3): undefined reference to `mxCreateNumericArray'
functions.cpp:(.text+0xdde): undefined reference to `mxGetData'
functions.cpp:(.text+0xefe): undefined reference to `mxGetScalar'
functions.cpp:(.text+0xf9d): undefined reference to `mxCreateNumericArray'
functions.cpp:(.text+0xfa8): undefined reference to `mxGetData'
functions.cpp:(.text+0x11dc): undefined reference to `mxCreateSparse'
functions.cpp:(.text+0x11e7): undefined reference to `mxGetJc'
functions.cpp:(.text+0x11f2): undefined reference to `mxGetIr'
functions.cpp:(.text+0x11fd): undefined reference to `mxGetPr'
residualfm/functions.o: In function `visit_backwards(Node*, Node*, double*, int)':
functions.cpp:(.text+0x232): undefined reference to `mexErrMsgTxt'
collect2: error: ld returned 1 exit status
make: *** [residualfm] Error 1

使用 mex functions.cpp 编译matlab工作良好

编辑:感谢你的提示 ! 解决了( 但不理解):

更改 residualfm: residualfm/functions.o 中的顺序:


$(MEX) $(MEXFLAGS) $(LIBS) -o $(MEXDIR)/$@.$(MEXSUFFIX) $^


$(MEX) -o $(MEXDIR)/$@.$(MEXSUFFIX) $^ $() $(MEXFLAGS) $(LIBS) 

解决了这个问题。有人可以解释?

时间: 作者:

( 在评论和编辑中解决。 在没有答案的情况下查看问题,但在注释中解决了问题

@Amro 写了:

链接库必须在命令行中编译的文件之后出现

OP写了:

更改 residualfm: residualfm/functions.o 中的顺序:

$(MEX) $(MEXFLAGS) $(LIBS) -o $(MEXDIR)/$@.$(MEXSUFFIX) $^

$(MEX) -o $(MEXDIR)/$@.$(MEXSUFFIX) $^ $() $(MEXFLAGS) $(LIBS)

解决了这个问题。

作者:
...