首页 > 编程语言 >Qt CUDA混合编程BUG(一)

Qt CUDA混合编程BUG(一)

时间:2023-08-10 15:46:04浏览次数:33  
标签:Qt QMAKE LIBS CUDA debug BUG DIR cuda

在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文件。

 1 # Configuration of the Cuda compiler
 2 CONFIG(debug, debug|release) {
 3     # Debug mode
 4     DESTDIR = debug
 5     OBJECTS_DIR = debug/obj
 6     CUDA_OBJECTS_DIR = debug/cuda
 7     cuda_d.input = CUDA_SOURCES
 8     cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o
 9 cuda_d.commands = $$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                       --compile -cudart static -g -DWIN32 -D_MBCS \
14                       -Xcompiler "/wd4819,/EHsc,/W3,/nologo,/Od,/Zi,/RTC1" \
15                       -Xcompiler $$MSVCRT_LINK_FLAG_DEBUG \
16                       -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
17     cuda_d.dependency_type = TYPE_C
18     QMAKE_EXTRA_COMPILERS += cuda_d
19 }
20 else {
21     # Release mode
22     DESTDIR = release
23     OBJECTS_DIR = release/obj
24     CUDA_OBJECTS_DIR = release/cuda
25     cuda.input = CUDA_SOURCES
26     cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o
27     cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
28                     --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -code=$$CUDA_CODE \
29                     --compile -cudart static -D_MBCS \
30                     -Xcompiler "/wd4819,/EHsc,/W3,/nologo,/O2,/Zi" \
31                     -Xcompiler $$MSVCRT_LINK_FLAG_RELEASE \
32                     -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
33     cuda.dependency_type = TYPE_C
34     QMAKE_EXTRA_COMPILERS += cuda
35 }

解决方案:

  需要讲外部库与参与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。

1 CONFIG(debug, debug|release) {
2 CUDA_LIB_NAMES += ucrtd \
3 }
4 else{
5 CUDA_LIB_NAMES += ucrt \
6 }
7 }

解决方案:

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

标签:Qt,QMAKE,LIBS,CUDA,debug,BUG,DIR,cuda
From: https://www.cnblogs.com/ybqjymy/p/17620497.html

相关文章

  • 跳过前端网页无限debugger
    跳过网站循环debugger在debugger处打断点后点击浏览器禁用断点后刷新页面在debugger前行号处右键,选择一律不在此处暂停添加Addconditionalbreakpoint填写false替换文件参考文章......
  • Qt 编写CUDA程序
    本文基于的情况是,Qt,CUDA和VS已经安装完成且能够正常运行的情况1.创建一个空的Qt项目2.创建一个.cu文件,本文创建的为kernel.cu内容如下1#include"cuda_runtime.h"2#include"device_launch_parameters.h"3#include<stdio.h>4cudaError_taddWithCuda(int*c,......
  • Qt 安装mqtt环境(这里默认以及有了Qt)
    首先QT的版本和mqtt包的版本要一致(我这里QT和mqtt的版本都是5.14.2)QT安装包(5.14.2)下载地址:Indexof/archive/qt/5.14mqtt包的一个连接(可以选择相应的版本)GitHub-qt/qtmqttat5.14.2将mqtt包解压后,mqtt.pro使用QTCREATOR打开,用release编译。编译中可能会出错:“QtMqt......
  • 记录一次解决数据库连接池连接泄露BUG
    1BUG现象系统并发请求,系统停滞无法使用,所有接口都是无法与后端进行交互的状态,系统并没有宕机2BUG的业务流程插入分数方法涉及插入表ABCD加了声明式事务查询分数方法涉及表ABCDcontroller(){ @Transactional insertVo(); selectById();}3排查原因因为代码不是......
  • CLion中构建最简单的QT环境
    在安装好QT之后,在CLion中新建项目,可以看到QT相关的项目类型。注意这里的QtCMake前缀,这里需要填QT的CMake路径。但是这里不填也是可以的。在CMakeList中还有机会填。Create项目之后,会有一票报错,没有关系先不管。首先在Setting中构建ToolChain。我这里有一个VS的MSVC,有一个我自......
  • MQTT协议入门介绍
    目录MQTT概览MQTT特点MQTT协议的主要特性MQTT主要应用MQTT基于主题(Topic)消息路由MQTTV3.1.1协议报文MQTT消息QoSMQTT会话(CleanSession)MQTT连接保活心跳MQTT遗愿消息(LastWill)MQTT保留消息(RetainedMessage)MQTTWebSocket连接MQTT协议客户端库MQTT与XMPP协议对比MQTT在线......
  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC的pytorch源码编译报错——
     如题:pytorch源码编译报错——USE_CUDA=OFF  在编译pytorch源码的时候发现错误,虽然编译环境中已经安装好CUDA和cudnn,环境变量也都设置好,但是编译好的pytorch包wheel总是在运行torch.cuda.is_available()显示false,于是从编译源码的过程中进行重新检查,发现在编译的过程中提......
  • Qt多语言切换时,QComboBox引起的一些问题
    板子Qt版本为5.9.5PC开发环境Qt版本为5.12.2界面有2个QComboBox,其中一个是用于切换语言,最开始使用的是voidcurrentIndexChanged(intindex)信号,多语言切换代码大致如下://绑定切换信号connect(ui->cbox_lang,QOverload<int>::of(&QComboBox::currentIndexChanged),this,&Fo......
  • Apache DolphinScheduler 3.1.8 版本发布,修复 SeaTunnel 相关 Bug
    近日,ApacheDolphinScheduler发布了3.1.8版本。此版本主要基于3.1.7版本进行了bug修复,共计修复16个bug,1个doc,2个chore。其中修复了以下几个较为重要的问题:修复在构建SeaTunnel任务节点的参数时错误的判断条件修复SeaTunnel任务运行模式默认为运行,无......
  • esp32 mqtt 局域网 通信 测试通过
    #include<WiFi.h>#include<stdlib.h>#include"WiFiClientSecure.h"#include"Adafruit_MQTT.h"#include"Adafruit_MQTT_Client.h"#include<ArduinoJson.h>#defineWLAN_SSID"xxx"#defineWLAN_PA......