从单独的文件中读取OpenCL内核

从单独的文件中读取OpenCL内核,opencl,Opencl,我试图从文件“kernel.cl”中读取OpenCL内核,但我读取的内核在读取后,在程序末尾会出现未知符号。未知符号的数量与内核文件中的行数相同 我用于获取内核的代码: FILE *fp; char *source_str; size_t source_size, program_size; fp = fopen("kernel.cl", "r"); if (!fp) { printf("Failed to load kernel\n"); return 1; } fseek

我试图从文件“kernel.cl”中读取OpenCL内核,但我读取的内核在读取后,在程序末尾会出现未知符号。未知符号的数量与内核文件中的行数相同

我用于获取内核的代码:

FILE *fp;
char *source_str;
size_t source_size, program_size;

fp = fopen("kernel.cl", "r");
if (!fp) {
    printf("Failed to load kernel\n");
    return 1;
}

fseek(fp, 0, SEEK_END);
program_size = ftell(fp);
rewind(fp);
source_str = (char*)malloc(program_size + 1);
source_str[program_size] = '\0';
fread(source_str, sizeof(char), program_size, fp);
fclose(fp);
这段代码适用于另一个项目,所以我不知道出了什么问题。如果内核中的所有代码都在一行上,那么它似乎也可以工作

任何帮助都将不胜感激,谢谢!:)

提到当以
“r”
作为模式字符串打开文件时,会发生一些与行尾相关的翻译。这意味着您查询的文件大小可能与
fread()
读取的数据量不匹配。这解释了为什么无效字符的数量等于文件中的行数(以及为什么它在一行中处理所有代码)

解决方案是使用
“rb”
标志打开文件:

fp = fopen("kernel.cl", "rb");

如果使用C++是一个选项,请查看库提供的方法。它简化了打开文件、读取内容以及使用源代码创建OpenCL程序对象的过程

例如,您可以简单地执行以下操作:

boost::compute::program my_program =
    boost::compute::program::create_with_source_file("kernel.cl");

这可能是在Windows上吗?如果是这样,请尝试将您的
fopen
更改为使用
“rb”
,而不是
“r”
。就是这样!非常感谢。很好-我添加了一个解释问题实际原因的答案。我投票赞成这个,因为我根本没有想过使用Boost.Compute。