在我的 test.cu 文件中(cu 文件项类型是 CUDA C/C++)
__global__ void foo()
{
}
void CudaMain()
{
foo<<<1,1>>>();
}
在我的 test.cpp 文件中
#include "mycuda.cu"
int main()
{
CudaMain();
return 0;
}
和编译器在 test.cu 文件中向我发送错误“错误 c2059 语法错误'<'”
在我的 test.cu 文件中(cu 文件项类型是 CUDA C/C++)
__global__ void foo()
{
}
void CudaMain()
{
foo<<<1,1>>>();
}
在我的 test.cpp 文件中
#include "mycuda.cu"
int main()
{
CudaMain();
return 0;
}
和编译器在 test.cu 文件中向我发送错误“错误 c2059 语法错误'<'”
在 C++ 文件中包含 CUDA 源文件不起作用,因为这只会使 CUDA 源代码成为 C++ 程序代码的一部分,而常规 C++ 编译器不理解 CUDA 语法扩展。如果您仍然希望将 CUDA 代码与非 CUDA C++ 代码分开,那么您可能需要考虑单独编译。CUDA 源代码可以编译为常规目标文件,然后可以与其他目标文件链接以生成可执行文件。
修改 C++ 代码为:
extern void CudaMain(void);
int main()
{
CudaMain();
return 0;
}
使用 C++ 编译器编译 CUDA 文件nvcc
,然后使用 C++ 代码链接生成的目标文件nvcc
(您可能还需要在链接命令中指定标准 C++ 库):
$ nvcc -c -o test_cuda.o test.cu
$ g++ -c -o test_cpp.o test.cpp
$ nvcc -o test.exe test_cuda.o test_cpp.o -lstdc++
编辑:您的问题是关于 VS2010。可能您必须在那里创建自定义构建步骤。
基于这里的线程:https ://forums.developer.nvidia.com/t/cuda-build-error/52615/4
您的测试文件扩展名也应该是 .cu,但如果您使用 MSCV 重命名还不够,您应该在 VS 项目中创建一个新的 CUDA C/C++ 源模块。
此外,您应该在 <> 运算符之间放置空格,例如。
foo< < <1,1> > >();
因为 C++ 无法解析 <<<>>>。
我知道这是一个老问题,但我一直在四处寻找,它让我想起了一个没有被提及的解决方案。
该nvcc
帮助提供:
--x {c|c++|cu} (-x)
Explicitly specify the language for the input files, rather than letting
the compiler choose a default based on the file name suffix.
Allowed values for this option: 'c','c++','cu'.
因此,尽管它有点生硬,但您可以这样做:
nvcc my_source.cpp -x cu ...
它会编译它,.cpp
就好像它被命名.cu
(即作为CUDA)。