当尝试编译这段代码时:
#define _USE_MATH_DEFINES
#include <cmath>
#include <cstdio>
void minimal_example(){
int i=2;
if(i==3 or i==4) printf("I want %d!\n",M_PI);
}
使用
nvcc -x cu -Xcompiler=/permissive- -dc cuda_nvcc_cl_test.cu -o cuda_nvcc_cl_test.obj
出现以下错误(在第7行中):
error: expected a ")"
error: identifier "M_PI" is undefined
我将Windows 10与Visual Studio的cl.exe(x64版本19.16.27031.1)和CUDA工具包10.1结合使用。
将cmath
替换为math.h
,将or
替换为||
(或者添加#include <ciso646>
)时,错误消失了。但是,是否有一些编译器选项或其他可能性,以便我可以按原样保留代码?
还有-Xcompiler=/permissive-
为什么没有帮助?
答案 0 :(得分:2)
这里有2个问题:
在解析代码之前,显然nvcc
包含cmath
。如接受的答案here中所讨论的,如果您包含cmath
并且在那时没有实例化定义,则不会得到M_PI
的定义,和< / em>由于包含防护,后续包含cmath
的内容将无法解决。可能的解决方法是将-D_USE_MATH_DEFINES
添加到编译命令行中。这样将从编译过程开始就将定义放在适当的位置,并且M_PI
就是通过这种方式定义的。
与我理解为正确或标准行为相反,使用or
代替||
似乎取决于包含ciso646
(在{{1 }}仅适用于Windows / VisualStudio。Linux上的nvcc
似乎不需要)。是的,我知道不应以这种方式工作,但是似乎有必要。 This may be an issue with Visual Studio。如果愿意,可以尝试使用nvcc
开关。 (尝试时似乎没有帮助。)
使用CUDA 10.1,在VS2019上,当我对此进行编译时:
/Za
使用以下命令行:
#include <cstdio>
#include <ciso646>
void minimal_example(){
int i=2;
if(i==3 or i==4) printf("I want %f!\n",M_PI);
}
我没有收到任何错误或警告。请注意,我还将nvcc -x cu -dc test.cu -o test.obj -D_USE_MATH_DEFINES
的格式说明符从printf
更改为%d
,以与%f
的类型保持一致。
如果您确实不想包含M_PI
,请使用ciso646
的{{1}} supports来直接从命令行包含文件。因此,我可以将其编译为:
nvcc
像这样:
-include
没有错误或警告。