编译时有时会出现莫名其妙的错误。。。

在一个Kernel函数中要用到2组常量数组,于是把他们在.cuh头文件中定义好了,之后在Kernel.cu中引用该头文件,编译报错:
如下两图所示:yy和d为所需要定义的常量数组
[attach]2906[/attach]
[attach]2907[/attach]
[attach]2908[/attach]

报错为
1>h:\master\aco_gpu\aco_gpu\aco_parameters.cuh(20): error C2144: 语法错误:“float”的前面应有“;”
1>h:\master\aco_gpu\aco_gpu\aco_parameters.cuh(20): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>h:\master\aco_gpu\aco_gpu\aco_parameters.cuh(55): error C2144: 语法错误:“float”的前面应有“;”
1>h:\master\aco_gpu\aco_gpu\aco_parameters.cuh(55): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>h:\master\aco_gpu\aco_gpu\aco_parameters.cuh(55): error C2086: “int constant”: 重定义
1> h:\master\aco_gpu\aco_gpu\aco_parameters.cuh(20) : 参见“constant”的声明

于是我把这两个__constant__ 数组从头文件删除,放在了在Kernel.cu中,就不再报错了。

请问这是怎么回事呢?我以前貌似也这么用过,没出问题啊,这次就不行,不知怎么回事。。。

哦,我第二个数组好像截图中间少了一小部分,不过不影响这个问题。。

你最终编译的文件,可能类型不是CUDA C/C++, 或者没有被nvcc编译。

VC只能继续编译nvcc过滤过的,而不能直接支持__constant__之类的。

我建议你检查如下步骤:

(1)检查你的这个文件是在.cu中被#include的吗?还是在.cpp中。
(2)如果(1)的确在.cu中被#include, 请检查该.cu的类型是否为CUDA C/C++。:slight_smile:

EDIT: 以及检查,是否这个文件被多个文件都#include过,而其中一个是.cpp。

还真是,问题解决了,谢谢版主!

是不是说,.cu/.cuh文件可以#include .h文件,但是.cpp/.h文件是不可以包含.cuh文件的?

如3#所说,关键在于要被NVCC先处理一遍才可以,否则不认。