带有“M_PI”和“or”的 nvcc 编译错误
Posted
技术标签:
【中文标题】带有“M_PI”和“or”的 nvcc 编译错误【英文标题】:nvcc compilation errors with "M_PI" and "or" 【发布时间】:2019-05-27 03:55:30 【问题描述】:尝试编译这段代码时:
#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
我正在使用带有 Visual Studio 的 cl.exe(x64 版本 19.16.27031.1)和 CUDA 工具包 10.1 的 Windows 10。
将cmath
替换为math.h
并将or
替换为||
(或者添加#include <ciso646>
)时,错误消失。但是,是否有一些编译器选项或其他可能性,以便我可以保持代码不变?
还有为什么-Xcompiler=/permissive-
没有帮助?
【问题讨论】:
M_PI
也在cmath
中通过包含math.h
定义
【参考方案1】:
这里有两个问题:
显然nvcc
包含cmath
在解析您的代码之前。正如在接受的答案here 中所讨论的,如果您包含cmath
并且您没有在此时实例化定义,您将不会得到M_PI
定义,和随后包含cmath
不会解决这个问题,因为包括警卫。一种可能的解决方法是将-D_USE_MATH_DEFINES
添加到您的编译命令行中。这将定义从编译过程开始就到位,M_PI
就是这样定义的。
与我读到的正确或标准行为相反,使用or
代替||
似乎以包含ciso646
为条件(仅在Windows/Visual Studio 上使用nvcc
.nvcc
在 linux 上似乎不需要这个)。是的,我知道它不应该那样工作,但它似乎是必要的。 This may be an issue with Visual Studio。如果您愿意,可以尝试使用/Za
开关。 (当我尝试时,它似乎没有帮助。)
使用 CUDA 10.1,在 VS2019 上,当我编译这个时:
#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
、nvcc
supports,请使用-include
开关直接从命令行包含文件。因此我可以编译这个:
#include <cstdio>
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 -include ciso646
没有错误或警告。
【讨论】:
谢谢,这非常有用!您是否了解为什么 -Xcompiler=/permissive- 不起作用?我希望它将 permissive- 选项传递给 cl 编译器。 PS:请原谅 printf 中的 d/f 错字。 我不知道你对那个开关有什么期望,“没有工作”或“没有帮助”对我来说没有任何意义。你读过docs吗?在这种情况下,您希望该开关做什么?什么没有奏效?请注意,末尾带有减号的permissive-
会使编译器限制更多。它禁用语言许可行为并尝试执行更严格的合规性。
还注意到上面链接的文档中permissive-
似乎是从更高版本的 VS2017 开始的默认行为。所以我不确定添加它会有什么不同;它已经默认开启。
更清楚地说,我的期望是使用 /permissive-
我不会收到有关使用 or
的错误,基于:***.com/questions/24414124/…以上是关于带有“M_PI”和“or”的 nvcc 编译错误的主要内容,如果未能解决你的问题,请参考以下文章
带有 VS 2013 的 cuda v6.5 nvcc 失败,神秘的消息
Visual Studio 是不是使用 nvcc 编译 cuda 代码?
CUDA compiler driver nvcc 散点 part 2