我正在尝试将参数传递给OpenCL编译器,其中包含空格,但我无法找到如何使其正确处理空间(即不只是将它们解释为下一个参数的开头)。我的代码是这样的:
status = clBuildProgram(output_program, 1, devices, "-D OutputType=unsigned char", 0, 0);
显然,这会导致编译错误
Error in processing command line: Don't understand command line argument "char"!
是否有人知道正确的语法,以使其理解我希望将OutputType
定义为unsigned char
?
答案 0 :(得分:2)
即使这个问题已经过时,我仍然会不时地看到它。 AMD的OpenCL工具链仍然不能处理在命令行上定义的宏中的空格,而它现在似乎与NVIDIA一起工作。
简单的解决方案是用\ t \ t替换所有空格。
选项卡计为编译器的空格,但不计入预处理器的标记分隔符。
答案 1 :(得分:1)
这是命令行空间处理中的一个错误,它不是(至少在最近的NVIDIA平台上)作为标准的Unix(或至少是Windows)命令行工作。
我尝试过多次括号,包括\' \" \\" \\'
和反引号`
。我甚至试图逃避空间本身(-D OutputType=unsigned\ char
)。这没有用,命令行字符串可能根据空格的位置简单地切换到标记,似乎没有人关心括号。
一种解决方案是读取字符串中的源代码,并在其前面加上一行:
#define OutputType unsigned char
然而,有一个更简单的解决方案。您需要在文件中包含以下宏:
#define MKTWOWORD(a,b) a b
然后你可以使用以下任何一个:
status = clBuildProgram(output_program, 1, devices,
"-D OutputType=MKTWOWORD(unsigned,char)", 0, 0);
status = clBuildProgram(output_program, 1, devices,
"-D OutputType=MKTWOWORD(unsigned,int)", 0, 0);
status = clBuildProgram(output_program, 1, devices,
"-D OutputType=MKTWOWORD(signed,int)", 0, 0);
status = clBuildProgram(output_program, 1, devices,
"-D OutputType=int", 0, 0);
优点是你只需要在命令行上进行字符串处理,而不是整个源代码。
这是一个无赖,但使用-D选项在源代码中获取MKTWOWORD宏是不可能的,因为它会导致chiken-or-egg问题。你只需要在你的内核中包含它。
答案 2 :(得分:0)
你有没有尝试用\“:
逃脱它们status = clBuildProgram(output_program, 1, devices, "-D OutputType=\"unsigned char\"", 0, 0);