C++ CUDA编译器对象到可执行文件

C++ CUDA编译器对象到可执行文件,c++,cuda,C++,Cuda,我正在尝试使用命令行编译CUDA应用程序,但遇到了一些问题 我知道运行命令 nvcc -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Od,/Zi,/MTd -o test.obj test.cu 从批处理文件生成一个obj文件,我需要使用链接器生成一个可执行文件。我在V

我正在尝试使用命令行编译CUDA应用程序,但遇到了一些问题

我知道运行命令

nvcc -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Od,/Zi,/MTd -o test.obj test.cu
从批处理文件生成一个obj文件,我需要使用链接器生成一个可执行文件。我在VisualStudio中遇到了几乎不可修复的问题,所以我试图避免它,但我不知道如何完成我的程序编译


我需要知道的是:我应该如何处理我的对象文件以获得一个我可以实际运行的可执行文件?

假设您的
test.cu
是一个完整的应用程序(例如,有一个
main
函数等),对命令行的两个更改可能是删除
-c
开关和更改
-o
开关以指定典型的windows文件可执行文件名,例如
test.exe
,即
-o test.exe

以下测试用例在Windows 7、CUDA 8和VS 2015上演示了这一点:

C:\Users\bob\Documents>type test.cu
#include <stdio.h>

__global__ void t(){
  printf("hello\n");
}

int main(){

  t<<<1,1>>>();
  cudaDeviceSynchronize();
  printf("%s\n", cudaGetErrorString(cudaGetLastError()));
  return 0;
}
C:\Users\bob\Documents>nvcc -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin" -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xc
ompiler /EHsc,/W3,/nologo,/Od,/Zi,/MTd -o test.exe test.cu
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-depreca
ted-gpu-targets to suppress warning).
test.cu
   Creating library test.lib and object test.exp

C:\Users\bob\Documents>test
hello
no error

C:\Users\bob\Documents>
C:\Users\bob\Documents>type test.cu
#包括
__全局无效t(){
printf(“hello\n”);
}
int main(){
t();
cudaDeviceSynchronize();
printf(“%s\n”,cudaGetErrorString(cudaGetLastError());
返回0;
}
C:\Users\bob\Documents>nvcc-ccbin“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\VC\bin”-D_DEBUG-DWIN32-D_CONSOLE-D_MBCS-Xc
ompiler/EHsc、/W3、/nologo、/Od、/Zi、/MTd-o test.exe test.cu
nvcc警告:“compute_20”、“sm_20”和“sm_21”体系结构已被弃用,可能会在将来的版本中删除(使用-Wno弃用)
ted gpu目标以抑制警告)。
test.cu
创建库test.lib和对象test.exp
C:\Users\bob\Documents>test
你好
无误
C:\Users\bob\Documents>
请注意,即使是对
-o
开关的更改也不是绝对必要的。此开关仅指定输出文件名称,与实际编译流无关(在本例中,实际编译流由
-c
开关的存在与否控制——请参阅)。您可以通过将
-o
开关保持原样来证明这一点。然后,您将拥有一个名为
test.obj
的可执行文件,您可以通过在命令提示符下键入
test.obj
来证明这一点。它将以与上面所示相同的输出执行


但它可能会令人困惑,并且不是windows的典型文件命名约定。

假设您的
test.cu
是一个完整的应用程序(例如,具有
主功能等),对命令行的两个更改可能是删除
-c
开关和更改
-o
开关以指定典型的windows文件可执行文件名,例如
test.exe
,即
-o test.exe

以下测试用例在Windows 7、CUDA 8和VS 2015上演示了这一点:

C:\Users\bob\Documents>type test.cu
#include <stdio.h>

__global__ void t(){
  printf("hello\n");
}

int main(){

  t<<<1,1>>>();
  cudaDeviceSynchronize();
  printf("%s\n", cudaGetErrorString(cudaGetLastError()));
  return 0;
}
C:\Users\bob\Documents>nvcc -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin" -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xc
ompiler /EHsc,/W3,/nologo,/Od,/Zi,/MTd -o test.exe test.cu
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-depreca
ted-gpu-targets to suppress warning).
test.cu
   Creating library test.lib and object test.exp

C:\Users\bob\Documents>test
hello
no error

C:\Users\bob\Documents>
C:\Users\bob\Documents>type test.cu
#包括
__全局无效t(){
printf(“hello\n”);
}
int main(){
t();
cudaDeviceSynchronize();
printf(“%s\n”,cudaGetErrorString(cudaGetLastError());
返回0;
}
C:\Users\bob\Documents>nvcc-ccbin“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\VC\bin”-D_DEBUG-DWIN32-D_CONSOLE-D_MBCS-Xc
ompiler/EHsc、/W3、/nologo、/Od、/Zi、/MTd-o test.exe test.cu
nvcc警告:“compute_20”、“sm_20”和“sm_21”体系结构已被弃用,可能会在将来的版本中删除(使用-Wno弃用)
ted gpu目标以抑制警告)。
test.cu
创建库test.lib和对象test.exp
C:\Users\bob\Documents>test
你好
无误
C:\Users\bob\Documents>
请注意,即使是对
-o
开关的更改也不是绝对必要的。此开关仅指定输出文件名称,与实际编译流无关(在本例中,实际编译流由
-c
开关的存在与否控制——请参阅)。您可以通过将
-o
开关保持原样来证明这一点。然后,您将拥有一个名为
test.obj
的可执行文件,您可以通过在命令提示符下键入
test.obj
来证明这一点。它将以与上面所示相同的输出执行


但是它可能会让人困惑,并且不是windows的典型文件命名约定。

你的问题到底是什么?@njuffa我已经更新了帖子,现在应该更清楚了。只需删除-c选项…@Talonmes,它完全没有做任何事情。它解决了你的问题,你只是没有意识到而已。在上面的示例中,您指定的输出文件现在是一个完全链接的可执行文件。试着从命令行运行它,看看你自己到底有什么问题?@njuffa我已经更新了帖子,现在应该更清楚了。只需删除-c选项…@Talonmes,它完全没有做任何事情。它解决了你的问题,你只是没有意识到而已。在上面的示例中,您指定的输出文件现在是一个完全链接的可执行文件。试着从命令行运行它,自己看看