在QTCreator中使用MinGW编译c和cuda代码
我试图编译简单的cuda程序(我从
Compiling Cuda code in Qt Creator on Windows获取源代码)
这是我的.pro文件: TARGET = Cuda # Define output directories DESTDIR = release OBJECTS_DIR = release/obj CUDA_OBJECTS_DIR = release/cuda # Sourcefiles SOURCES += main.cpp # This makes the .cu files appear in your project OTHER_FILES += vectorAddition.cu # CUDA settings <-- may change depending on your system CUDA_SOURCES += vectorAddition.cu CUDA_SDK = "C:/Cuda/CudaSamples" # Path to cuda SDK install CUDA_DIR = "C:/Cuda/CudaToolkit" # Path to cuda toolkit install SYSTEM_NAME = Win32 # Depending on your system either 'Win32','x64',or 'Win64' SYSTEM_TYPE = 32 # '32' or '64',depending on your system CUDA_ARCH = sm_11 # Type of CUDA architecture,for example 'compute_10','compute_11','sm_10' TEMP = 'C:Program Files (x86)Microsoft Visual Studio 10.0VCbin' #tried to add VS compiler path,seems woring. When i changed it to higher version error appeared VS = $$join(TEMP,'" -ccbin "','-ccbin "','"') #joing path to VS compiler with quotes NVCC_OPTIONS = --use_fast_math $$VS # include paths INCLUDEPATH += $$CUDA_DIR/include $$CUDA_SDK/common/inc/ $$CUDA_SDK/../shared/inc/ # library directories QMAKE_LIBDIR += $$CUDA_DIR/lib/$$SYSTEM_NAME $$CUDA_SDK/common/lib/$$SYSTEM_NAME $$CUDA_SDK/../shared/lib/$$SYSTEM_NAME C:/CUDA/VS10/VC/lib #tried to add VS runtime libraries,after that some errors disappeared,and some new emerged so i guess it worked QMAKE_LIBS += -lmsvcrt -llibcmt -llibcpmt #after adding VS runtime to QMAKE_LIBDIR this line seems to have no effect # Add the necessary libraries LIBS += -lcuda -lcudart #LIBS += -lmsvcr100 QMAKE_CFLAGS_RELEASE += -v MSVCRT_LINK_FLAG_DEBUG = "/MTd" MSVCRT_LINK_FLAG_RELEASE = "/MT" # The following makes sure all path names (which often include spaces) are put between quotation marks CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"') #this was nested in CONFIG (see link above) but i dont think it worked cuda.input = CUDA_SOURCES cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -Xcompiler "/wd4819,/EHsc,/W3,/nologo,/O2,/Zi" -Xptxas -v -Xcompiler $$MSVCRT_LINK_FLAG_RELEASE -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} #Xptxas -v is command for some extra output during cuda compiling (nvvc). -Xcompiler,honesly i have no idea what "/wd4819,/Zi" means,i copied those from some chinese webpage and again some errors went away cuda.dependency_type = TYPE_C QMAKE_EXTRA_COMPILERS += cuda HEADERS += vectorAddition.h #empty header,i was just trying something. 这是编译器输出: 13:09:17: Running steps for project Cuda... 13:09:17: Starting: "F:ProgramsQt5.1.1Toolsmingw48_32binmingw32-make.exe" clean F:/Programs/Qt5.1.1/Tools/mingw48_32/bin/mingw32-make -f Makefile.Release clean mingw32-make[1]: Entering directory 'F:/workspaceSchool/build-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Release' del releasecudavectorAddition_cuda.o del releasecudavectorAddition_cuda.o releaseobjmain.o Could Not Find F:workspaceSchoolbuild-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-ReleasereleasecudavectorAddition_cuda.o mingw32-make[1]: Leaving directory 'F:/workspaceSchool/build-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Release' F:/Programs/Qt5.1.1/Tools/mingw48_32/bin/mingw32-make -f Makefile.Debug clean mingw32-make[1]: Entering directory 'F:/workspaceSchool/build-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Release' del releasecudavectorAddition_cuda.o Could Not Find F:workspaceSchoolbuild-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-ReleasereleasecudavectorAddition_cuda.o del releasecudavectorAddition_cuda.o debugobjmain.o Could Not Find F:workspaceSchoolbuild-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-ReleasereleasecudavectorAddition_cuda.o Could Not Find F:workspaceSchoolbuild-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Releasedebugobjmain.o mingw32-make[1]: Leaving directory 'F:/workspaceSchool/build-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Release' 13:09:18: The process "F:ProgramsQt5.1.1Toolsmingw48_32binmingw32-make.exe" exited normally. 13:09:18: Starting: "F:ProgramsQt5.1.15.1.1mingw48_32binqmake.exe" F:workspaceSchoolCudaCuda.pro -r -spec win32-g++ -v QMake version 3.0 Using Qt version 5.1.1 in F:ProgramsQt5.1.15.1.1mingw48_32lib 13:09:18: The process "F:ProgramsQt5.1.15.1.1mingw48_32binqmake.exe" exited normally. 13:09:18: Starting: "F:ProgramsQt5.1.1Toolsmingw48_32binmingw32-make.exe" F:/Programs/Qt5.1.1/Tools/mingw48_32/bin/mingw32-make -f Makefile.Release mingw32-make[1]: Entering directory 'F:/workspaceSchool/build-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Release' C:CudaCudaToolkitbinnvcc.exe --use_fast_math -ccbin "C:Program Files (x86)Microsoft Visual Studio 10.0VCbin" -I"C:/Cuda/CudaToolkit/include" -I"C:/Cuda/CudaSamples/common/inc/" -I"C:/Cuda/CudaSamples/../shared/inc/" -lcuda -lcudart --machine 32 -arch=sm_11 -Xcompiler /wd4819,/Zi -Xptxas -v -Xcompiler /MT -c -o releasecudavectorAddition_cuda.o ..CudavectorAddition.cu ptxas : info : 0 bytes gmem ptxas : info : Compiling entry function '__cuda_dummy_entry__' for 'sm_11' ptxas : info : Used 0 registers g++ -c -pipe -fno-keep-inline-dllexport -O2 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..Cuda -I"C:CudaCudaToolkitinclude" -I"C:CudaCudaSamplescommoninc" -I"C:CudaCudaSamples..sharedinc" -I"....ProgramsQt5.1.15.1.1mingw48_32include" -I"....ProgramsQt5.1.15.1.1mingw48_32includeQtGui" -I"....ProgramsQt5.1.15.1.1mingw48_32includeQtCore" -I"release" -I"." -I"....ProgramsQt5.1.15.1.1mingw48_32mkspecswin32-g++" -o releaseobjmain.o ..Cudamain.cpp In file included from C:CudaCudaToolkitinclude/device_types.h:53:0,from C:CudaCudaToolkitinclude/builtin_types.h:56,from ..Cudamain.cpp:2: C:CudaCudaToolkitinclude/host_defines.h:79:0: warning: "__cdecl" redefined [enabled by default] #define __cdecl ^ ..Cudamain.cpp:1:0: note: this is the location of the previous definition #include <cuda.h> ^ In file included from C:CudaCudaToolkitinclude/builtin_types.h:60:0,from ..Cudamain.cpp:2: C:CudaCudaToolkitinclude/vector_types.h:73:0: warning: ignoring #pragma warning [-Wunknown-pragmas] #pragma warning(push) ^ C:CudaCudaToolkitinclude/vector_types.h:74:0: warning: ignoring #pragma warning [-Wunknown-pragmas] #pragma warning(disable: 4201 4408) ^ C:CudaCudaToolkitinclude/vector_types.h:350:0: warning: ignoring #pragma warning [-Wunknown-pragmas] #pragma warning(pop) ^ g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o releaseCuda.exe release/cuda/vectorAddition_cuda.o release/obj/main.o -lglu32 -lopengl32 -lgdi32 -luser32 -lmingw32 -lqtmain -LC:CudaCudaToolkitlibWin32 -LC:CudaCudaSamplescommonlibWin32 -LC:CudaCudaSamples..sharedlibWin32 -LC:CUDAVS10VClib -LQMAKE_LIBS -L+= -L-lmsvcrt -L-llibcmt -L-llibcpmt -lcuda -lcudart -LF:ProgramsQt5.1.15.1.1mingw48_32lib -lQt5Gui -lQt5Core Warning: .drectve `/FAILIFMISMATCH:"_MSC_VER=1600" /FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=0" /DEFAULTLIB:"libcpmt" /DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unrecognized f:/programs/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/lib/../lib/crt2.o:crtexe.c:(.text+0xcf): undefined reference to `_imp___fmode' f:/programs/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/lib/../lib/crt2.o:crtexe.c:(.text+0x2de): undefined reference to `_imp___acmdln' f:/programs/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/lib/../lib/crt2.o:crtexe.c:(.text+0x3cf): undefined reference to `_imp____initenv' f:/programs/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/bin/ld.exe: f:/programs/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/lib/../lib/crt2.o: bad reloc address 0x0 in section `.CRT$XCAA' collect2.exe: error: ld returned 1 exit status Makefile.Release:78: recipe for target 'releaseCuda.exe' failed mingw32-make[1]: Leaving directory 'F:/workspaceSchool/build-Cuda-Desktop_Qt_5_1_1_MinGW_32bit-Release' makefile:34: recipe for target 'release' failed mingw32-make[1]: *** [releaseCuda.exe] Error 1 mingw32-make: *** [release] Error 2 13:09:28: The process "F:ProgramsQt5.1.1Toolsmingw48_32binmingw32-make.exe" exited with code 2. Error while building/deploying project Cuda (kit: Desktop Qt 5.1.1 MinGW 32bit) When executing step 'Make' 13:09:28: Elapsed time: 00:11. 以及所有问题(无法发布低代表图像):issues 如果我没有弄错,那么问题是链接cuda目标文件(vectorAddition_cuda.o),它是由nvvc.exe与cl.exe和VS libs编译的.然后MinGW(g编译器)尝试以某种方式将cuda目标文件和c对象文件(main.o)与所有lib链接到可执行文件中.然而,g不知道VS运行时库,并抛出这些错误.所以我想我需要以某种方式将VS libs传递给g. 解决方法
我有点困惑,你使用的是MinGW还是Visual?标题似乎表明您正在使用MinGW,但项目文件似乎使用了两者的混合.你不能混合那两个.如果您使用Visual Studio 2010编译(或直接从NVidia下载二进制文件)CUDA,您必须使用VS10来编译项目,否则它将无法工作.
我自己从未使用过CUDA,但似乎system requirements只提到了Visual Studio 2008,2010和2012.如果你想在Qt中使用它,那么你可能只需要使用VS编译一个Qt(有32和在download page上都是64位.只要您不使用它创建任何商业应用程序,您就可以获得Visual Studio Express for free. 要将QtCreator与MSVC后端编译器一起使用,请转到工具>选项>构建并运行>套件并添加一个新的套件与MSVC编译器,cdb作为调试器和刚刚下载的Qt版本(它必须使用相同的Visual Studio版本编译,否则它将无法工作).然后打开项目,转到Projects选项卡(左侧)并选择刚刚创建的Kit.在一切顺利进行之前,您应该清理.pro文件. 另外,在链接器行中有一些似乎不合适的事情: g++ -Wl,windows -mthreads -o releaseCuda.exe release/cuda/vectorAddition_cuda.o release/obj/main.o -lglu32 -lopengl32 -lgdi32 -luser32 -lmingw32 -lqtmain -LC:CudaCudaToolkitlibWin32 -LC:CudaCudaSamplescommonlibWin32 -LC:CudaCudaSamples..sharedlibWin32 -LC:CUDAVS10VClib -LQMAKE_LIBS -L+= -L-lmsvcrt -L-llibcmt -L-llibcpmt -lcuda -lcudart -LF:ProgramsQt5.1.15.1.1mingw48_32lib -lQt5Gui -lQt5Core 首先是-L =,这可能是由QMAKE_LIBDIR末尾的转义反斜杠引起的. 然后语法-L-lmsvcrt似乎错了.这可能是因为您使用的是QMAKE_LIBS,我个人从未使用过它,根据the documentation,您不应该因为它是内部变量.同样适用于 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |