我想從命令行使用mex,或者更確切地說,從makefile鏈接庫。我做這從一個Makefile我張貼在這裏:用g ++從命令行控制mex鏈接選項
BDDM_MATLAB = @[email protected]
MEXCC = $(BDDM_MATLAB)/bin/mex
MEXFLAGS = -v -largeArrayDims -O
MEXEXT = mexa64
TDIR = $(abs_top_srcdir)/test
IDIR = $(abs_top_srcdir)/src
LDIR = $(abs_top_srcdir)/lib
LOP1 = $(CUDA_LDFLAGS) $(LIBS)
SOURCES := $(wildcard *.cpp)
OBJS = $(SOURCES:.cpp=.o)
mTESTS = $(addprefix $(TDIR)/, $(SOURCES:.cpp=.$(MEXEXT)))
all: $(TDIR) $(mTESTS)
$(OBJS) : %.o : %.cpp
$(MEXCC) $(MEXFLAGS) -c -outdir ./ -output [email protected] $(CUDA_CFLAGS) -I$(IDIR) CFLAGS="\$$CFLAGS -std=c99" $^
$(mTESTS) : $(TDIR)/%.$(MEXEXT) : %.o
$(MEXCC) $(MEXFLAGS) -L$(LDIR) -outdir $(TDIR) $^ $(LOP1) -lmpdcm LDFLAGS="-lcudart -lcuda"
.PHONY = $(TDIR)
$(TDIR):
$(MKDIR_P) [email protected]
clean:
$(RM) *.o
libmpdcm是包括兩個共享庫libcuda和libcudart調用靜態庫。我的環境有
出口LD_LIBRARY_PATH =在/ usr /本地/ CUDA-7.0/lib64目錄:$ LD_LIBRARY_PATH:
我的化妝規則產生
/usr/local/MATLAB/R2014a/bin/mex -v -largeArrayDims -O -L/home/eaponte/projects/test_cpp/lib -outdir /home/eaponte/projects/test_cpp/test test_LayeredEEG.o -L/usr/local/cuda/lib64 -lcudart -lcuda -lmpdcm LDFLAGS="-lcudart -lcuda"
這將產生以下G ++命令:
/usr/bin/gcc -lcudart -lcuda -shared -O -Wl,--version-script,"/usr/local/MATLAB/R2014a/extern/lib/glnxa64/mexFunction.map" test_LayeredEEG.o -lcudart -lcuda -lmpdcm -L/home/eaponte/projects/test_cpp/lib -L/usr/local/cuda/lib64 -L"/usr/local/MATLAB/R2014a/bin/glnxa64" -lmx -lmex -lmat -lm -lstdc++ -o /home/eaponte/projects/test_cpp/test/test_LayeredEEG.mexa64
問題是,之後我在Matlab中得到一個鏈接錯誤:
Invalid MEX-file '/home/eaponte/projects/test_cpp/test/test_Fmri.mexa64': /home/eaponte/projects/test_cpp/test/test_Fmri.mexa64: undefined symbol: cudaFree
我知道溶液是簡單地把CUDA庫在++命令
/usr/bin/gcc -lcudart -lcuda -shared -O -Wl,--version-script,"/usr/local/MATLAB/R2014a/extern/lib/glnxa64/mexFunction.map" test_LayeredEEG.o -lmpdcm -L/home/eaponte/projects/test_cpp/lib -L/usr/local/cuda/lib64 -L"/usr/local/MATLAB/R2014a/bin/glnxa64" -lmx -lmex -lmat -lm -lstdc++ -lcudart -lcuda -o /home/eaponte/projects/test_cpp/test/test_LayeredEEG.mexa64
如何實現這一運行從命令行MEX(或從生成文件)的克的結束?
這是在運行時,對不對?你可能只需要調整你的LD_LIBRARY_PATH或者LD_RUN_PATH(參見['setenv'](http://www.mathworks.com/help/matlab/ref/setenv.html)以在MATLAB內部完成)到包括CUDA運行時的位置。或者,如果您想鏈接靜態CUDA運行時,您可以在'mex'命令末尾列出.a文件。只是一個猜測,所以我沒有發佈答案。 – chappjc
儘管我可以看到最後一個可能如何解決連接錯誤,但這三條命令行都沒有從鏈接 的角度完全有意義。請在您的問題中發佈makefile,以及用於運行失敗make的 命令行以及失敗make的完整 控制檯輸出(來自clean)。此外,什麼是 'libmpdcm'庫,它來自哪裏? –
@chappjc我已經解決了您的意見。 – eaponte