在Qt中使用Cuda进行编译会产生链接错误

时间:2012-09-03 17:53:47

标签: c++ qt4 cuda

我正在尝试在32位Windows 7系统上的Qt Creator 4.8.0中编译Cuda代码(以.cu文件的形式),我目前正在失败。

我把以下项目文件放在一起:

TARGET = TestCUDA
DESTDIR = release
OBJECTS_DIR = release/obj
CUDA_OBJECTS_DIR = release/cuda

SOURCES += main.cpp
CUDA_SOURCES += test.cu

CUDA_SDK = "C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C" # Path to cuda SDK install
CUDA_DIR = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v4.2" # Path to cuda toolkit install

INCLUDEPATH += $$CUDA_DIR/include \
               $$CUDA_SDK/common/inc/ \
               $$CUDA_SDK/../shared/inc/
QMAKE_LIBDIR += $$CUDA_DIR/lib/Win32 \
                $$CUDA_SDK/common/lib/Win32 \    
                $$CUDA_SDK/../shared/lib/Win32
LIBS += -lcuda -lcudart
CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"')   # this is to put quotes around paths with spaces

cuda.input = CUDA_SOURCES
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.ptx
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$CUDA_INC $$LIBS --machine 32 -ptx -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
cuda.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda

这应该在release / cuda /文件夹中生成一个test_cuda.ptx模块。顺便说一句,这正是它的作用,欢呼! 但它也会出现LNK1107错误:

C:\path\to\release\cuda\test_cuda.ptx:-1: error: LNK1107: invalid or corrupt file: cannot read at 0xFCC

我不知道为什么会这样,也不知道如何解决。此错误中指示的位置位于test_cuda.ptx文件中间的某个位置,但这没有任何帮助。同样奇怪的是,当我在另一个Cuda应用程序中导入它时,同一个文件工作正常,因此文件没有损坏。 main.cpp完全为空:

int main(int argc, char* argv []) {}

所以这不是链接器出错的地方。似乎链接器链接它不应该链接的东西,但我不知道为什么,或者如何阻止它。有人有想法吗?

1 个答案:

答案 0 :(得分:1)

如@asm所述,您正在编译PTX中间文件,然后尝试将它们作为目标文件链接。但是反对@asm的建议,你不应该编译成cubin,而是编译目标文件。为此,您需要-c选项而不是-ptx选项:

cuda.input = CUDA_SOURCES
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$CUDA_INC $$LIBS --machine 32 -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}

警告:不是QMAKE用户,因此上述内容可能不完全正确。我是对CMake的推荐。

相关问题