这是Using #include to load OpenCL code
的后续内容我注意到当你使用grrussel描述的方法(并在Bullet Physics中使用)时,创建的字符串会删除所有换行符(注释似乎也被剥离了,但我也不是担心这一点)。现在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,那么这很好,但如果有代码将无法使用OpenCL编译器进行编译。
有没有办法让#include
保留换行符,或者有更好的方法将opencl代码嵌入到我的可执行文件中(除了将字符串复制到cpp文件中并加上引号一切)?
我在Visual Studio 2010中对此进行了测试,我不确定其他编译器是否表现出相同的行为。我更喜欢一种不需要任何外部工具并与各种编译器/平台配合使用的方法。
从其他答案中复制代码:
在C ++ / C源代码
#define MSTRINGIFY(A) #A
char* stringifiedSourceCL =
#include "VectorAddKernels.cl"
在OpenCL源代码中
MSTRINGIFY(
__kernel void VectorAdd(__global float8* c)
{
// snipped out OpenCL code...
return;
}
);
答案 0 :(得分:1)
很棒的问题!
在Windows上运行的一件事是将OpenCL C文件视为Windows资源。然后源代码内置到您的可执行文件中。在您的reasource(.rc)文件中,您可以添加如下内容:
IDR_OPENCL_FILE_1 OPENCL_SOURCE "mydir\\myfile.cl"
然后,在主机源中,像这样:
// Load the resource memory
HRSRC resource = FindResource(NULL, L"IDR_OPENCL_FILE_1", L"OPENCL_SOURCE");
HGLOBAL resMem = LoadResource(NULL, resource);
char* source = (char*)LockResource(resMem);
// Build a STL string out of it
DWORD resSize = SizeofResource(NULL, resource);
std::string cl_source = string(source, resSize);
在Linux上,objcopy会让你做类似的事情。您可以将源文件导出为符号来构建精灵.o。对不起,我现在没有方便的代码片段。
我希望有更好的平台无关答案。如果你碰到它,请告诉我。
答案 1 :(得分:1)
我会编写一个小工具,使用文本文件中的常量字符串生成一个cpp,然后将其与其他内容一起编译。
这就是Qt的资源编译器moc所做的事情(以及更多,因为它周围有一个完整的API),还有Windows资源工具包的选项(参见下面的this answer)。
无论如何,一个小型构建工具可以在dir中遍历文件并从中构建cpp应该足够了,并且可以在15分钟内完成一些内容(给定合适的脚本技能)。
更新:根据Henry的评论,在Linux上(或使用Msys / Cygwin),您可以将xxd与-i(即xxd -i
)标志一起使用,读取文件并生成一个c-include文件,其中包含正确定义的内容。