2014-09-22 44 views
0

我編譯一些CUDA/C爲在Matlab一個MEX庫運行,我收到以下錯誤:未定義參考用Matlab/CUDA MEX __cxa_atexit

Error using mex 
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS): In function `atexit': 
(.text+0x12): undefined reference to `__cxa_atexit' 
collect2: error: ld returned 1 exit status 

我假設這個手段我需要鏈接一些額外的庫,但是什麼?

我目前的編譯命令是:

mex -L/usr/local/cuda/lib64 -lcudart -I./ A.cpp B.cpp C.cu D.cpp 

我有幾個內核編譯成MEX,有趣他們中的一些工作,他們中的一些沒有。我不會立即看到他們之間有什麼不同 - 我當然不會在我的來源的任何地方撥打atexit

這裏是一個冗長MEX的輸出:

Verbose mode is on. 
Neither -compatibleArrayDims nor -largeArrayDims is selected. 
    Using -compatibleArrayDims. In the future, MATLAB will require the use of 
    -largeArrayDims and remove the -compatibleArrayDims option. 
    For more information: 
    http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html. 
... Looking for compiler 'nvcc' ... 
... Looking for environment variable 'MW_NVCC_PATH' ...Yes ('/usr/local/cuda-6.5/bin/nvcc'). 
... Looking for folder '/usr/local/cuda-6.5/bin' ...Yes. 
... Looking for file '/usr/local/cuda-6.5/bin/nvcc' ...Yes. 
... Executing command 'which g++' ...Yes ('/usr/bin/g++'). 
... Executing command 'g++ -print-file-name=libstdc++.so' ...Yes ('/usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so'). 
Found installed compiler 'nvcc'. 
Options file details 
------------------------------------------------------------------- 
    Compiler location: /usr/local/cuda-6.5/bin/nvcc 
    Options file: /home/nick/Documents/FrameLab/matlab/mex/source codes/mex_CUDA_glnxa64.xml 
    CMDLINE2 : /usr/bin/g++ -pthread -Wl,--no-undefined -shared -O -Wl,--version-script,"/usr/local/MATLAB/R2014a/extern/lib/glnxa64/mexFunction.map" /tmp/mex_86382821022260_3849/Atx_fan_mf.o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o /tmp/mex_86382821022260_3849/find_l.o /tmp/mex_86382821022260_3849/find_area.o -lcudart -L/usr/local/cuda/lib64 -Wl,-rpath-link,/usr/local/MATLAB/R2014a/bin/glnxa64 -L"/usr/local/MATLAB/R2014a/bin/glnxa64" -lmx -lmex -lmat -lm -lmwgpu /usr/local/MATLAB/R2014a/bin/glnxa64/libcudart.so.5.5 -o Atx_fan_mf.mexa64 
    CXX : /usr/local/cuda-6.5/bin/nvcc 
    DEFINES : -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE 
    MATLABMEX : -DMATLAB_MEX_FILE 
    NVCCFLAGS : -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS 
    CXXFLAGS : --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread 
    INCLUDE : -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" 
    CXXOPTIMFLAGS : -O -DNDEBUG 
    CXXDEBUGFLAGS : -g 
    LDXX : /usr/bin/g++ 
    LDFLAGS : -pthread -Wl,--no-undefined 
    LDTYPE : -shared 
    LINKEXPORT : -Wl,--version-script,"/usr/local/MATLAB/R2014a/extern/lib/glnxa64/mexFunction.map" 
    LINKLIBS : -lcudart -L/usr/local/cuda/lib64 -Wl,-rpath-link,/usr/local/MATLAB/R2014a/bin/glnxa64 -L"/usr/local/MATLAB/R2014a/bin/glnxa64" -lmx -lmex -lmat -lm -lmwgpu /usr/local/MATLAB/R2014a/bin/glnxa64/libcudart.so.5.5 
    LDOPTIMFLAGS : -O 
    LDDEBUGFLAGS : -g 
    OBJEXT : .o 
    LDEXT : .mexa64 
    NVCC : /usr/local/cuda-6.5/bin/nvcc 
    GCC : /usr/bin/g++ 
    CPPLIB_DIR : /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so 
    MATLABROOT : /usr/local/MATLAB/R2014a 
    ARCH : glnxa64 
    SRC : "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf.cpp";"/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_gpu_new.cu";"/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_gpu_new_fb.cu";"/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_cpu_new.cpp";"/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_cpu_new_fb.cpp";"/home/nick/Documents/FrameLab/matlab/mex/source codes/find_l.cpp";"/home/nick/Documents/FrameLab/matlab/mex/source codes/find_area.cpp" 
    OBJ : /tmp/mex_86382821022260_3849/Atx_fan_mf.o;/tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o;/tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o;/tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o;/tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o;/tmp/mex_86382821022260_3849/find_l.o;/tmp/mex_86382821022260_3849/find_area.o 
    OBJS : /tmp/mex_86382821022260_3849/Atx_fan_mf.o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o /tmp/mex_86382821022260_3849/find_l.o /tmp/mex_86382821022260_3849/find_area.o 
    SRCROOT : /home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf 
    DEF : /tmp/mex_86382821022260_3849/Atx_fan_mf.def 
    EXP : Atx_fan_mf.exp 
    LIB : Atx_fan_mf.lib 
    EXE : Atx_fan_mf.mexa64 
    ILK : Atx_fan_mf.ilk 
    MANIFEST : Atx_fan_mf.mexa64.manifest 
    TEMPNAME : Atx_fan_mf 
    EXEDIR : 
    EXENAME : Atx_fan_mf 
    OPTIM : -O -DNDEBUG 
    LINKOPTIM : -O 
    CMDLINE1_0 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf.cpp" -o /tmp/mex_86382821022260_3849/Atx_fan_mf.o 
    CMDLINE1_1 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_gpu_new.cu" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o 
    CMDLINE1_2 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_gpu_new_fb.cu" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o 
    CMDLINE1_3 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_cpu_new.cpp" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o 
    CMDLINE1_4 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_cpu_new_fb.cpp" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o 
    CMDLINE1_5 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/find_l.cpp" -o /tmp/mex_86382821022260_3849/find_l.o 
    CMDLINE1_6 : /usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/find_area.cpp" -o /tmp/mex_86382821022260_3849/find_area.o 
    CMDLINE3_0 : rm -f /tmp/mex_86382821022260_3849/Atx_fan_mf.o 
    CMDLINE3_1 : rm -f /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o 
    CMDLINE3_2 : rm -f /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o 
    CMDLINE3_3 : rm -f /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o 
    CMDLINE3_4 : rm -f /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o 
    CMDLINE3_5 : rm -f /tmp/mex_86382821022260_3849/find_l.o 
    CMDLINE3_6 : rm -f /tmp/mex_86382821022260_3849/find_area.o 
------------------------------------------------------------------- 
Building with 'nvcc'. 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf.cpp" -o /tmp/mex_86382821022260_3849/Atx_fan_mf.o 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_gpu_new.cu" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_gpu_new_fb.cu" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_cpu_new.cpp" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/Atx_fan_mf_cpu_new_fb.cpp" -o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/find_l.cpp" -o /tmp/mex_86382821022260_3849/find_l.o 
/usr/local/cuda-6.5/bin/nvcc -c -DMX_COMPAT_32 --compiler-options=-D_GNU_SOURCE,-DMATLAB_MEX_FILE -I./ -I"/usr/local/MATLAB/R2014a/extern/include" -I"/usr/local/MATLAB/R2014a/toolbox/distcomp/gpu/extern/include/" -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS --compiler-options=-ansi,-fexceptions,-fPIC,-fno-omit-frame-pointer,-pthread -O -DNDEBUG "/home/nick/Documents/FrameLab/matlab/mex/source codes/find_area.cpp" -o /tmp/mex_86382821022260_3849/find_area.o 
/usr/bin/g++ -pthread -Wl,--no-undefined -shared -O -Wl,--version-script,"/usr/local/MATLAB/R2014a/extern/lib/glnxa64/mexFunction.map" /tmp/mex_86382821022260_3849/Atx_fan_mf.o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new.o /tmp/mex_86382821022260_3849/Atx_fan_mf_gpu_new_fb.o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new.o /tmp/mex_86382821022260_3849/Atx_fan_mf_cpu_new_fb.o /tmp/mex_86382821022260_3849/find_l.o /tmp/mex_86382821022260_3849/find_area.o -lcudart -L/usr/local/cuda/lib64 -Wl,-rpath-link,/usr/local/MATLAB/R2014a/bin/glnxa64 -L"/usr/local/MATLAB/R2014a/bin/glnxa64" -lmx -lmex -lmat -lm -lmwgpu /usr/local/MATLAB/R2014a/bin/glnxa64/libcudart.so.5.5 -o Atx_fan_mf.mexa64 

我想知道如果我應該嘗試使用不同版本的G ++或C++庫?我不知道如何改變CPPLIB_DIR變量... Matlab讓2014年更難以混淆mex設置。

感謝您的任何想法!

+1

'__cxa_atexit'符號用於註冊靜態/全局對象的C++析構函數。你的版本不包括C++庫。也許嘗試運行'mex -setup C++'或手動指定合適的C++庫。 – 2014-09-22 05:48:09

+0

試過運行'mex -setup C++'無濟於事。檢查Matlab網站後,顯然2014a不需要'mex -setup'步驟 - 它應該會自動檢測大量的編譯器設置。請參閱編輯的問題... – icurays1 2014-09-22 06:14:57

+0

我不熟悉'mex'或'nvcc',但它看起來像最後一行使用'g ++'來鏈接,所以應該使用C++庫。也許嘗試傳遞一個'Wl, - verbose'選項(我不知道如何指定它 - 也許在makefile中使用'LDFLAGS + = -Wl, - verbose'行)。實際上,您應該能夠在命令行中複製/粘貼日誌的最後一行 - 添加新選項。這應該會導致鏈接器轉儲有關它正在查找的每個庫的信息以及lib的位置。在這種情況下可能會有一大堆信息。 – 2014-09-22 06:57:06

回答

1

我在Ubuntu 14.04上用CUDA 6.5和g ++ 4.8得到了同樣的錯誤,使用Matlab 2015預發佈。感謝Matlab的支持,我們發現,手動鏈接可以做到這一點。下面是我對matlab mex/gpu示例的編譯腳本:

myArch = computer('arch'); pathToOpts = fullfile(matlabroot, ... 'toolbox', 'distcomp', 'gpu', ... 'extern', 'src', 'mex', myArch,'gcc',... ['mex_CUDA_' myArch '.xml']); copyfile(pathToOpts,'.','f') 

mex -v -largeArrayDims mexGPUExample.cu -lstdc++ -lc 
+0

忘記接受你的答案。它對我來說是在mex選項的xml文件中爲我的LDFLAGS變量添加了'-lstdC++'。謝謝! – icurays1 2016-02-25 16:39:04