QT+CUDA混合编程BUG(一):
在QT中进行CUDA编程,CUDA库与其他外部库冲突,debug失败
问题描述
在QT中进行CUDA编程,单独使用CUDA编程时并未出现难以解决的问题,但当我讲CUDA处理的部分,加入已搭建完毕一项较大的QT项目工程时,CUDA的lib库与项目使用到的其他外部lib库文件出现冲突,导致debug失败。可能出现多种错误场景。
问题一
(1)nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified
nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified
jom: D:\C++study\QT\build_Studio_v1-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug\Makefile.Debug [debug\cuda\gpustreaming_cuda.o] Error 1
原因分析:
在.pro文件中配置CUDA时,由于外部库文件加入项目用的是:LIBS += G:/V3/C++/PARS_Studio_v1/lib/CsAppSupport.lib
;而CUDA库文件使用的也是LIBS += $$NVCC_LIBS
;这导致在config时,CUDA编译生成.obj文件是直接使用的是LIBS
,下面代码中的导致参与NVCC编译的不仅仅是CUDA库,外部库的存在会导致无法生成.obj文件。
# Configuration of the Cuda compiler
CONFIG(debug, debug|release) {
# Debug mode
DESTDIR = debug
OBJECTS_DIR = debug/obj
CUDA_OBJECTS_DIR = debug/cuda
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o
cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -code=$$CUDA_CODE \
--compile -cudart static -g -DWIN32 -D_MBCS \
-Xcompiler "/wd4819,/EHsc,/W3,/nologo,/Od,/Zi,/RTC1" \
-Xcompiler $$MSVCRT_LINK_FLAG_DEBUG \
-c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
cuda_d.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda_d
}
else {
# Release mode
DESTDIR = release
OBJECTS_DIR = release/obj
CUDA_OBJECTS_DIR = release/cuda
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 -code=$$CUDA_CODE \
--compile -cudart static -D_MBCS \
-Xcompiler "/wd4819,/EHsc,/W3,/nologo,/O2,/Zi" \
-Xcompiler $$MSVCRT_LINK_FLAG_RELEASE \
-c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
cuda.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda
}
解决方案:
需要讲外部库与参与NVCC编译的CUDA库区分开,但是仍然都需要加入到LIBS
中。因此修改上面debug代码中的cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
的LIBS
改为NVCC_LIBS
。release同样更改即可。
问题二
(2).obj : error LNK2001: 无法解析的外部符号 __imp__invalid_parameter
.obj : error LNK2001: 无法解析的外部符号 __imp__invalid_parameter
.obj : error LNK2001: 无法解析的外部符号 __imp__CrtDbgReport
原因分析:
无法解析的外部符号,一般是因为没有找到对应的库文件,例如ucrt.lib等。在这里debug出现问题,而release却没问题,是因为没有给编译过程中给予指定的ucrtd.lib。
CONFIG(debug, debug|release) {
CUDA_LIB_NAMES += ucrtd \
}
else{
CUDA_LIB_NAMES += ucrt \
}
}
解决方案:
将上述代码加入.pro文件中,放在CUDA配置中,在CUDA编译器之前,即# Configuration of the Cuda compiler
之前。但是要确保自己的电脑有ucrtd等文件,这个一般是在安装windows sdk时装进电脑,一般在安装VS时,勾选了Windows SDK 的任一版本就可以了。