我有一个用 Qt(Win32,VS2010)和 CUDA 编写的项目,我的 cu 文件包含 Qt 头文件。当我尝试使用新的 Qt 5.0(Qt 4.8.3 可以)构建我的项目时,出现以下错误:
C:/Qt/Qt5.0.0/5.0.0/msvc2010/include\QtCore/qobject_impl.h(82): error: too many initializer values
C:/Qt/Qt5.0.0/5.0.0/msvc2010/include\QtCore/qobject_impl.h(85): error: too many initializer values
C:/Qt/Qt5.0.0/5.0.0/msvc2010/include\QtCore/qobject_impl.h(89): error: too many initializer values
我创建了一个简单的项目来重现该错误并被重现。我相信任何带有 CUDA 的 Qt 项目都可以重复使用 Qt 头文件。但是,我添加了简单的代码来重现下面的错误。谁能帮我?
test1.pro 文件:
QT += core
QT -= gui
TARGET = qt_cuda_test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
OTHER_FILES += \
kernel.cu
INCLUDEPATH += $$quote($$(CUDA_INC_PATH))
CUDA_SOURCES += kernel.cu
CUDA_SDK = "C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 5.0/C" # Path to cuda SDK install
CUDA_DIR = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v5.0" # 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_20 # Type of CUDA architecture, for example 'compute_10', 'compute_11', 'sm_10'
NVCC_OPTIONS = --use_fast_math
# 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
# Add the necessary libraries
LIBS += -lcuda -lcudart
# The following library conflicts with something in Cuda
QMAKE_LFLAGS_RELEASE = /NODEFAULTLIB:msvcrt.lib
# The following makes sure all path names (which often include spaces) are put between quotation marks
CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"')
# Configuration of the Cuda compiler
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 -I"C:/Qt/Qt5.0.0/5.0.0/msvc2010/include" $$LIBS --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
cuda.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda
kernel.cu 文件:
#include <QtCore/QCoreApplication>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
cudaError_t addWithCuda(int *c, const int *a, const int *b, size_t size);
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int main()
{
const int arraySize = 5;
const int a[arraySize] = { 1, 2, 3, 4, 5 };
const int b[arraySize] = { 10, 20, 30, 40, 50 };
int c[arraySize] = { 0 };
cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
return 0;
}
// do something with cuda
cudaError_t addWithCuda(int *c, const int *a, const int *b, size_t size)
{
int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
cudaError_t cudaStatus;
}