当前位置: 首页 > 网络知识

Qt CUDA混合编程BUG(一)

时间:2026-01-29 09:25:03

在QT中进行CUDA编程,CUDA库与其他外部库冲突,debug失败

问题描述

  在QT中进行CUDA编程,单独使用CUDA编程时并未出现难以解决的问题,但当我讲CUDA处理的部分,加入已搭建完毕一项较大的QT项目工程时,CUDA的lib库与项目使用到的其他外部lib库文件出现冲突,导致debug失败。可能出现多种错误场景。

问题一
(1)nvcc fatal : A single input file is required for a nonlink phase when an outputfile is specified

nvcc fatal : A single input file is required for a nonlink phase when an outputfile is specified j: D:\C++study\QT\build_Studio_v1Desktop_Qt_5_14_2_MSVC2017_64bitDebug\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文件。

1 # Configuration of the Cuda cpiler 2 CONFIG(debug, debug|release) _cuda.o 9 cuda_dmands = $$CUDA_DIR/bin/nvcc.exe D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \ 10 11 12 machine $$SYSTEM_TYPE arch=$$CUDA_ARCH code=$$CUDA_CODE \ 13 cpile cudart static g DWIN32 D_MBCS \ 14 Xcpiler "/wd4819,/EHsc,/W3,/nologo,/Od,/Zi,/RTC1" \ 15 Xcpiler $$MSVCRT_LINK_FLAG_DEBUG \ 16 c o $ $ 17 cuda_d.dependency_type = TYPE_C 18 QMAKE_EXTRA_CPILERS += cuda_d 19 } 20 else _cuda.o 27 cudamands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \ 28 machine $$SYSTEM_TYPE arch=$$CUDA_ARCH code=$$CUDA_CODE \ 29 cpile cudart static D_MBCS \ 30 Xcpiler "/wd4819,/EHsc,/W3,/nologo,/O2,/Zi" \ 31 Xcpiler $$MSVCRT_LINK_FLAG_RELEASE \ 32 c o $ $ 33 cuda.dependency_type = TYPE_C 34 QMAKE_EXTRA_CPILERS += cuda 35 }

解决方案:

  需要讲外部库与参与NVCC编译的CUDA库区分开,但是仍然都需要加入到LIBS中。因此修改上面debug代码中的cuda_dmands = $ $ 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。

1 CONFIG(debug, debug|release) 4 else 7 }

解决方案:

  将上述代码加入.pro文件中,放在CUDA配置中,在CUDA编译器之前,即# Configuration of the Cuda cpiler之前。但是要确保自己的电脑有ucrtd等文件,这个一般是在安装windows sdk时装进电脑,一般在安装VS时,勾选了Windows SDK 的任一版本就可以了。



上一篇:进程间通信的6种方式
下一篇:CUDA Memcpy的分析
Qt CUDA
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素