Cuda windows上的nvcc编译对象不是有效的文件格式

Cuda windows上的nvcc编译对象不是有效的文件格式,cuda,g++,mingw,nvcc,Cuda,G++,Mingw,Nvcc,因为我没有访问nVIDIA卡,所以我使用GPUOcelot编译和运行我的程序。因为我已经把我的CUDA内核和C++程序分成两个单独的文件(因为我使用C++ 11个特性),所以我做了以下操作来运行我的程序。 nvcc-c my_kernel.cu-arch=sm_20 g++-std=c++0x-c my_main.cpp g++my_kernel.o my_main.o-o最新的_输出.o'OcelotConfig-l' 我最近被允许访问一个装有nVIDIA卡的Windows机箱。我下载了适

因为我没有访问nVIDIA卡,所以我使用GPUOcelot编译和运行我的程序。因为我已经把我的CUDA内核和C++程序分成两个单独的文件(因为我使用C++ 11个特性),所以我做了以下操作来运行我的程序。
  • nvcc-c my_kernel.cu-arch=sm_20
  • g++-std=c++0x-c my_main.cpp
  • g++my_kernel.o my_main.o-o最新的_输出.o
    'OcelotConfig-l
    '
我最近被允许访问一个装有nVIDIA卡的Windows机箱。我下载了适用于windows和mingw g++的CUDA工具包。现在我跑了

  • nvcc-c my_kernel.cu-arch=sm_20
  • g++-std=c++0x-c my_main.cpp
nvcc调用现在不再生成my_kernel.o,而是生成my_kernel.obj。当我尝试链接它们并像以前一样使用g++运行时

  • g++my_kernel.obj my_main.o-om
我得到以下错误:

my_kernel.obj: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 status

你能解决这个问题吗?谢谢。

nvcc是一个编译器包装器,在引擎盖下调用设备编译器和主机编译器(它也可以调用主机链接器,但您使用的是
-c
,因此不进行链接)。在Windows上,支持的主机编译器是Visual Studio中的cl.exe

链接两个不同的C++编译器创建的两个对象文件通常是不可能的,即使你只使用CPU。这是因为ABI是不同的。您看到的错误消息只是告诉您cl.exe中的对象文件格式(通过nvcc)与g++不兼容


您需要使用cl.exe编译
my_main.cpp
,如果这会产生错误,那么这是另一个问题

CUDA for windows设计用于Visual Studio编译器而不是mingw g++编译器,这是真的吗?似乎您正在尝试链接由不同编译器生成的两个对象文件。嗨,Eric!windows上的nvcc需要Visual Studio的cl.exe,我已经配置了我的系统,以便能够运行正常的cuda程序。但这需要将内核和主机分离为2个文件,因为nvcc与C++11构造不兼容。因此选择了g++。我曾尝试使用cl.exe/Fo创建一个对象文件,但失败了,因为它给了我0xc000007b错误。我在SO和其他地方读到,这可能是由于32/64位dll不匹配造成的。我的系统是Windows 7 64位。我无法进一步解决这个问题。