2011-11-23 37 views
5

這是一個後續到Using #include to load OpenCL code嵌入的OpenCL代碼轉換成可執行

我注意到,當您使用grrussel描述(和子彈物理使用)的方法,所創建的字符串有刪除所有換行符(評論似乎也被剝奪了,但我並不擔心這一點)。現在大多數情況下,如果包含的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; 
    } 
); 

回答

1

我會寫一個小工具,它會從文本文件中生成一個帶有常量字符串的cpp,然後您將與其他東西一起編譯。

這就是Qt的資源編譯器moc所做的(更多,因爲它有一個完整的API),並且還有Windows資源工具包(請參閱下面的this answer)的選項。

無論如何,一個小的構建工具可以在一個dir文件中構建一個cpp文件,並且可以在15分鐘內完成一些任務(具有合適的腳本編寫技能)。

更新:按照亨利的評論,在Linux(或MSYS/Cygwin的),你可以使用xxd用-i(即xxd -i)標誌,它讀取文件並生成C-包括文件與確切的內容正確定義。

+1

['xxd -i'](http://linux.die.net/man/1/xxd)爲你做到這一點。 –

+0

@HenryGomersall:'xxd'在Windows上不易用,或者? – Macke

+1

我不知道;)我認爲它可以通過msys或cygwin。我發佈了這個評論,因爲我花了一點時間才發現xxd解決方案首先遇到了你的答案,所以肯定在linux下這是一個很好的解決方案。當然是 –

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。對不起,我現在沒有一個方便的代碼片段。

我希望有一個更好的平臺無關的答案。如果你遇到它,讓我知道。

+0

獨立於平臺的解決方案是Qt的moc或xxd,通過cygwin/msys或類似的東西。 – Macke