0

由于我无法使用 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 -om

我收到以下错误:

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

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

4

1 回答 1

2

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

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

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

于 2013-08-22T10:23:20.807 回答