Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将OpenCL代码嵌入可执行文件_C++_Visual Studio 2010_Opencl - Fatal编程技术网

C++ 将OpenCL代码嵌入可执行文件

C++ 将OpenCL代码嵌入可执行文件,c++,visual-studio-2010,opencl,C++,Visual Studio 2010,Opencl,这是一个后续行动 我注意到,当您使用grrussel描述的方法(并在子弹物理中使用)时,创建的字符串已删除所有换行符(注释似乎也被删除,但我并不太担心)。现在,在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,这是可以的,但是如果有,代码将无法使用opencl编译器编译 有没有办法让#include保留换行符,或者有更好的方法将opencl代码嵌入到我的可执行文件中(除了将字符串复制到cpp文件中并在所有内容周围加引号之外) 我在VisualStudio2010中对此进行了测试,

这是一个后续行动

我注意到,当您使用grrussel描述的方法(并在子弹物理中使用)时,创建的字符串已删除所有换行符(注释似乎也被删除,但我并不太担心)。现在,在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,这是可以的,但是如果有,代码将无法使用opencl编译器编译

有没有办法让
#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。