C++ 编译cuda文件错误:";“运行库”;不匹配值';MDd#U DynamicDebug';不';t匹配值';MTd#U静态调试';矢量加法
我尝试在Qt5.2和MSVC2012环境中编译cuda文件。 在我开始我的项目之前,我仔细阅读了以下问题并回答:。 尽管我只是简单地复制了代码并在qt中生成了2个文件,但仍然会出现一些错误C++ 编译cuda文件错误:";“运行库”;不匹配值';MDd#U DynamicDebug';不';t匹配值';MTd#U静态调试';矢量加法,c++,qt,cuda,C++,Qt,Cuda,我尝试在Qt5.2和MSVC2012环境中编译cuda文件。 在我开始我的项目之前,我仔细阅读了以下问题并回答:。 尽管我只是简单地复制了代码并在qt中生成了2个文件,但仍然会出现一些错误 /main.cpp /vectorAddition.cu 错误是: error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MTd_StaticDebug' in
/main.cpp
/vectorAddition.cu
错误是:
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MTd_StaticDebug' in vectorAddition_cuda.o
我完全不知道如何修复这个bug。我在网上读了一些关于在MSVC2012中修复不匹配的文章。但是很少有人提到如何在Qt.pro文件中实现这一点。有谁碰巧有这个问题吗
我还将pro文件附在这里(根据我自己的目录进行了轻微修改)
对“问题重复”的解释:
我也读了这篇文章
但不同的是,我的问题是关于NVCC在Qt中的设置,这比在MSVC环境中更复杂。尽管/MDd是由以下代码设置的,但如果没有正确的NVCC设置,cu文件仍然无法编译。运行库的简单更改并没有完全解决我的问题。这是NVCC的设置最终做出的
# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG = "/MDd"
MSVCRT_LINK_FLAG_RELEASE = "/MD"
我通过阅读另一篇文章解决了我的问题 正如问题所暗示的那样。MSVCRT链接选项需要保持一致。因此,在NVCC配置之前添加了
/MDd
设置
但关键是正确设置cuda.commands
。与问题不同:(我尝试了那个配置,但不适合我)
我的nvcc设置如下:
# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG = "/MDd"
MSVCRT_LINK_FLAG_RELEASE = "/MD"
CONFIG(debug, debug|release) {
#Debug settings
# Debug mode
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--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 settings
cuda.input = CUDA_SOURCES
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--compile -cudart static -DWIN32 -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
}
尽管我仍然不完全理解一些cuda.commands,但它确实有效。
有关NVCC配置的更多详细信息,请参阅
这是我的.pro文件的完整版本
#-------------------------------------------------
#
# Project created by QtCreator 2013-09-01T16:29:35
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = FFTW //your project name
TEMPLATE = app
HEADERS += dialog.h \
include/fftw3.h \ //header i need for my project
SOURCES += main.cpp\
dialog.cpp
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/
DESTDIR = debug
OBJECTS_DIR = debug/obj # directory where .obj files will be saved
CUDA_OBJECTS_DIR = debug/obj # directory where .obj of cuda file will be saved
# This makes the .cu files appear in your project
OTHER_FILES += intmapping.cu # this is my cu file need to compile
# CUDA settings <-- may change depending on your system
CUDA_SOURCES += intmapping.cu # let NVCC know which file you want to compile CUDA NVCC
CUDA_SDK = "C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C" # Path to cuda SDK install
CUDA_DIR = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v6.5"
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_20 # Type of CUDA architecture, for example 'compute_10', 'compute_11', 'sm_10'
NVCC_OPTIONS += --use_fast_math # default setting
# include paths
INCLUDEPATH += $$CUDA_DIR/include\
$$CUDA_SDK/common/inc\
$$CUDA_SDK/../shared/inc\
# library directories
QMAKE_LIBDIR += $$join(CUDA_DIR,'" -I"','-I"','"')/lib/$$SYSTEM_NAME\
$$join(CUDA_SDK,'" -I"','-I"','"')/common/lib/$$SYSTEM_NAME\
$$join(CUDA_SDK,'" -I"','-I"','"')/../shared/lib/$$SYSTEM_NAME
# Add the necessary libraries
CUDA_LIBS= -lcuda -lcudart -lcufft
#add quotation for those directories contain space (Windows required)
CUDA_INC +=$$join(INCLUDEPATH,'" -I"','-I"','"')
LIBS += $$CUDA_LIBS
#nvcc config
# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG = "/MDd"
MSVCRT_LINK_FLAG_RELEASE = "/MD"
CONFIG(debug, debug|release) {
#Debug settings
# Debug mode
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--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 settings
cuda.input = CUDA_SOURCES
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--compile -cudart static -DWIN32 -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
}
FORMS += \
dialog.ui
win32: LIBS += -L$$PWD/lib/ -llibfftw3f-3 #library i need in my project
INCLUDEPATH += $$PWD/lib
DEPENDPATH += $$PWD/lib
#-------------------------------------------------
#
#QtCreator创建的项目2013-09-01T16:29:35
#
#-------------------------------------------------
QT+=核心gui
greaterThan(QT\u主要版本,4):QT+=widgets
TARGET=FFTW//您的项目名称
模板=应用程序
标题+=dialog.h\
include/fftw3.h\//我的项目需要的标题
SOURCES+=main.cpp\
dialog.cpp
INCLUDEPATH+=$$PWD/
DEPENDPATH+=$$PWD/
DESTDIR=debug
OBJECTS_DIR=debug/obj#将保存.obj文件的目录
CUDA_OBJECTS_DIR=debug/obj#将保存CUDA文件的.obj的目录
#这会使.cu文件出现在项目中
其他_文件+=intmapping.cu#这是我需要编译的cu文件
#CUDA设置我投票赞成重新开放。如果重新打开,请将解决方案移至答案?谢谢。@JasonMArcher你想让我重新开始一个新问题吗?我是新来的,不熟悉操作。@jiang你应该在下面写下你自己问题的答案,并在问题中给出解决方案。之后,编辑您的问题以删除该部分。否。我想你文章的最后一部分是问题的解决方案?如果是这样,请将其移至下面的新答案。然后,您可以将其标记为已接受(投票箭头旁边),人们将能够清楚地看到解决方案。:)@JasonMArcher我刚刚发布了解决方案。将其标记为已接受将延迟24小时。谢谢你的指导:)这对我有帮助。-Xcompiler告诉编译器如何预处理/编译稍后可能与(纯主机)代码的其他部分链接的主机代码。这就是为什么(以及如何)在代码的两部分中保持MT/MD内容相同。
# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG = "/MDd"
MSVCRT_LINK_FLAG_RELEASE = "/MD"
CONFIG(debug, debug|release) {
#Debug settings
# Debug mode
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--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 settings
cuda.input = CUDA_SOURCES
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--compile -cudart static -DWIN32 -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
}
#-------------------------------------------------
#
# Project created by QtCreator 2013-09-01T16:29:35
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = FFTW //your project name
TEMPLATE = app
HEADERS += dialog.h \
include/fftw3.h \ //header i need for my project
SOURCES += main.cpp\
dialog.cpp
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/
DESTDIR = debug
OBJECTS_DIR = debug/obj # directory where .obj files will be saved
CUDA_OBJECTS_DIR = debug/obj # directory where .obj of cuda file will be saved
# This makes the .cu files appear in your project
OTHER_FILES += intmapping.cu # this is my cu file need to compile
# CUDA settings <-- may change depending on your system
CUDA_SOURCES += intmapping.cu # let NVCC know which file you want to compile CUDA NVCC
CUDA_SDK = "C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C" # Path to cuda SDK install
CUDA_DIR = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v6.5"
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_20 # Type of CUDA architecture, for example 'compute_10', 'compute_11', 'sm_10'
NVCC_OPTIONS += --use_fast_math # default setting
# include paths
INCLUDEPATH += $$CUDA_DIR/include\
$$CUDA_SDK/common/inc\
$$CUDA_SDK/../shared/inc\
# library directories
QMAKE_LIBDIR += $$join(CUDA_DIR,'" -I"','-I"','"')/lib/$$SYSTEM_NAME\
$$join(CUDA_SDK,'" -I"','-I"','"')/common/lib/$$SYSTEM_NAME\
$$join(CUDA_SDK,'" -I"','-I"','"')/../shared/lib/$$SYSTEM_NAME
# Add the necessary libraries
CUDA_LIBS= -lcuda -lcudart -lcufft
#add quotation for those directories contain space (Windows required)
CUDA_INC +=$$join(INCLUDEPATH,'" -I"','-I"','"')
LIBS += $$CUDA_LIBS
#nvcc config
# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG = "/MDd"
MSVCRT_LINK_FLAG_RELEASE = "/MD"
CONFIG(debug, debug|release) {
#Debug settings
# Debug mode
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--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 settings
cuda.input = CUDA_SOURCES
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \
--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \
--compile -cudart static -DWIN32 -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
}
FORMS += \
dialog.ui
win32: LIBS += -L$$PWD/lib/ -llibfftw3f-3 #library i need in my project
INCLUDEPATH += $$PWD/lib
DEPENDPATH += $$PWD/lib