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

时间:2013-08-22 08:54:00

标签: 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 latest_output.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 -o m

我收到以下错误:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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