C++ 将OpenCL代码嵌入可执行文件
这是一个后续行动 我注意到,当您使用grrussel描述的方法(并在子弹物理中使用)时,创建的字符串已删除所有换行符(注释似乎也被删除,但我并不太担心)。现在,在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,这是可以的,但是如果有,代码将无法使用opencl编译器编译 有没有办法让C++ 将OpenCL代码嵌入可执行文件,c++,visual-studio-2010,opencl,C++,Visual Studio 2010,Opencl,这是一个后续行动 我注意到,当您使用grrussel描述的方法(并在子弹物理中使用)时,创建的字符串已删除所有换行符(注释似乎也被删除,但我并不太担心)。现在,在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,这是可以的,但是如果有,代码将无法使用opencl编译器编译 有没有办法让#include保留换行符,或者有更好的方法将opencl代码嵌入到我的可执行文件中(除了将字符串复制到cpp文件中并在所有内容周围加引号之外) 我在VisualStudio2010中对此进行了测试,
#include
保留换行符,或者有更好的方法将opencl代码嵌入到我的可执行文件中(除了将字符串复制到cpp文件中并在所有内容周围加引号之外)
我在VisualStudio2010中对此进行了测试,我不确定其他编译器是否表现出相同的行为。我更喜欢一种不需要任何外部工具且可与各种编译器/平台配合使用的方法
从其他答案复制的代码:
C++/C源< /P>
#define MSTRINGIFY(A) #A
char* stringifiedSourceCL =
#include "VectorAddKernels.cl"
在OpenCL源代码中
MSTRINGIFY(
__kernel void VectorAdd(__global float8* c)
{
// snipped out OpenCL code...
return;
}
);
好问题
在Windows上工作的一件事是将OpenCLC文件视为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);
然后,在主机源中,类似以下内容:
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将允许您执行类似的操作。可以使用导出为符号的源文件构建elf.o。对不起,我现在手头没有这方面的代码片段
我希望有一个更好的独立于平台的答案。如果您遇到它,请告诉我。我会编写一个小工具,从文本文件生成一个带有常量字符串的cpp,然后您可以将其与其他内容一起编译 这就是Qt的资源编译器moc所做的(还有更多,因为它周围有一个完整的API),还有Windows的资源工具包选项(见下文) 无论如何,一个小的构建工具,可以在dir中遍历一个文件并从中构建一个cpp就足够了,您可以在15分钟内完成这项工作(如果有合适的脚本技能)
更新:根据Henry的评论,在Linux(或使用Msys/Cygwin)上,您可以使用-i(即
xxd-i
)标志,该标志读取文件并生成具有正确定义的确切内容的c-include文件。@HenryGomersall:xxd
在Windows上不容易获得,或者?我不知道;)我想可以通过msys或cygwin获得。我发表了评论,因为我花了一点时间才发现xxd解决方案首先遇到了您的答案,所以在linux下它肯定是一个很好的解决方案。我会把它包括在答案中。平台无关的解决方案是Qt的moc或通过cygwin/msys或类似的东西实现的xxd。