2014-01-15 46 views
1

我有一個使用Makefile編譯的matlab mex擴展。鏈接器似乎沒有找到mex庫。這裏是Makefile中:Matlab 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)/[email protected]$(MEXSUFFIX) $^ 

.cpp.o: 
    $(CXX) -c -o [email protected] $< $(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 

以下是錯誤:使用mex functions.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 

從MATLAB編譯: 感謝提示! 解決(但不理解):

$(MEX) $(MEXFLAGS) $(LIBS) -o $(MEXDIR)/[email protected]$(MEXSUFFIX) $^ 

$(MEX) -o $(MEXDIR)/[email protected]$(MEXSUFFIX) $^ $() $(MEXFLAGS) $(LIBS) 

解決了這個問題:

residualfm: residualfm/functions.o改變順序。有人可以解釋這個嗎?

+0

在MATLAB嘗試用'MEX -v編譯-largeArrayDims -O',看看可能需要添加到「MEXFLAGS」的包含路徑和其他標誌。 – Shai

+0

順便說一句,你有'#include「mex.h」'在你的CPP文件? – Shai

+0

錯誤提示您未正確鏈接到libmx/libmex。您可以嘗試'g ++ -v'來檢查日誌中是否找到它們。 – sebastian

回答