これはコマンド ライン スペース処理のバグであり、(少なくとも最近の NVIDIA プラットフォームでは) 標準の Unix (または少なくとも Windows) コマンドラインのようには機能しません。
\' \" \\" \\'
とbacktickを含む多くの中かっこを入れてみました`
。スペース自体をエスケープしようとさえしました(-D OutputType=unsigned\ char
)。これは役に立ちません。コマンド ライン文字列は、おそらくスペースの位置に基づいてトークンに切り刻まれているだけであり、誰も波括弧を気にしていないようです。
1 つの解決策は、ソース コードを文字列で読み取り、その前に 1 行を追加することです。
#define OutputType unsigned char
ただし、もっと簡単な解決策が 1 つあります。ファイルに次のマクロを含める必要があります。
#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 マクロを取得することはできません。鶏卵問題が発生するからです。それをカーネルに含めるだけです。