c++ - 在 Qt 中使用 Cuda 编译出现链接错误

标签 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 []) {}

所以这不是链接器可能出错的地方。链接器似乎正在链接它不应该链接的内容,但我不知道为什么,也不知道如何阻止它。有人有想法吗?

最佳答案

正如 @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 的建议。

关于c++ - 在 Qt 中使用 Cuda 编译出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12252248/

相关文章:

c++ - 在 map : How to clear inner map using iterators? 中映射

qt - 如何从 Qt 中的应用程序关闭已打开的浏览器

opengl - 使用 OpenGL 提供的矩阵在 CUDA 中设置光线

cuda - 动态检测启用 CUDA 的 NVIDIA 卡,然后才初始化 CUDA 运行时 : How to do?

linux - nvidia cuda 和驱动程序版本不足

c++ - 为什么initializer_list没有违反 "One Class-Type Conversion"的规则

c++ - 如何避免坏的 FD_SET 缓冲区溢出崩溃?

c++ - while 循环不适用于第二个循环

c++ - 如何设置 QT 调试器以提供更有意义的消息?

c++ - Qt 忽略 const 说明符