【发布时间】:2021-01-11 15:32:49
【问题描述】:
为文件提供扩展名 .cu 会导致 clang 的预处理输出 (-E) 重复:
$ cat main.cu
int main(){}
$ clang -E -nocudalib -nocudainc main.cu
# 1 "main.cu"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 666 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.cu" 2
int main(){}
# 1 "main.cu"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 665 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.cu" 2
int main(){}
使用.c时似乎正常:
$ cat main.c
int main(){}
$ clang -E -nocudalib -nocudainc main.c
clang: warning: argument unused during compilation: '-nocudainc' [-Wunused-command-line-argument]
# 1 "main.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 341 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.c" 2
int main(){}
根据我推断的警告,clang 实际上正确地检测到它是一个 CUDA 文件。我也可以在没有-nocudainc -nocudalib 的情况下进行编译,例如clang -E --cuda-gpu-arch=sm_50 main.cu。此输出也几乎完全重复,但有 10,000 行。
以.cu 或.c 正常编译文件。如果我将预处理器输出保存为.i 文件,我可以编译来自.c 文件的输出,但不能编译来自.cu 文件的输出:
$ clang main.i
main.cu:1:5: error: redefinition of 'main'
int main(){}
^
main.cu:1:5: note: previous definition is here
int main(){}
^
1 error generated.
我想知道为什么输出重复,如果我可以避免它。
【问题讨论】:
-
我很确定这是 Clang 用于 CUDA 代码的编译轨迹的产物,您对此无能为力
标签: cuda clang c-preprocessor