CUDA 语法错误'<'
CUDA syntax error '<'
在我的 test.cu 文件中(cu文件项类型为CUDA C/C++)
__global__ void foo()
{
}
void CudaMain()
{
foo<<<1,1>>>();
}
在我的测试中.cpp文件
#include "mycuda.cu"
int main()
{
CudaMain();
return 0;
}
和编译器向我发送错误"错误 C2059 语法错误'<'"test.cu
在
C++文件中包含 CUDA 源文件不起作用,因为这只会使 CUDA 源成为C++程序代码的一部分,并且常规C++编译器不理解 CUDA 语法扩展。如果您仍然希望将 CUDA 代码与非 CUDA C++代码分开,那么您可能需要考虑单独的编译。CUDA 源代码可以编译为常规目标文件,然后可以与其他目标文件链接以生成可执行文件。
将C++代码修改为:
extern void CudaMain(void);
int main()
{
CudaMain();
return 0;
}
使用 nvcc
编译 CUDA 文件,使用 C++ 编译器编译 C++ 代码,然后将生成的对象文件与 nvcc
链接(您可能还需要在 link 命令中指定标准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)。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- <<操作员在下面的行中工作
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- 重载运算符<<用于ostream语法