首页 > 解决方案 > NVCC unistd.h(792):错误:需要一个标识符

问题描述

NVCC 正在返回一个错误,但几乎没有信息可继续。该项目在迁移到所谓的“现代 cmake”之前进行了编译。我不再使用 findCUDA。我进行了多次网络搜索,但找不到帮助解决问题的线索。任何帮助都会很棒。谢谢。

[  3%] Building CUDA object CMakeFiles/foo_cuda.dir/src/foo/gpu/gpu_camera.cu.o
/usr/local/cuda/bin/nvcc  -DFOO_DATA_DIR=\"/home/developer/Data\" -DFOO_RESULTS_DIR=\"/home/developer/Results\" -DBAR_GFLAGS_NAMESPACE=google -DBAR_SUITESPARSE_VERSION=\"5.1.2\" -D__CUDACC__ -I/home/developer/Source/Foo/include -I/home/developer/Source/Foo/src -I/home/developer/Source/Foo -I/usr/local/include -I/usr/local/cuda/include -I/home/developer/Source/Foo/SYSTEM -I/usr/include/eigen3  -g -Xcompiler=-fPIC   -w -std=c++14 -Xcompiler=-fopenmp -use_fast_math -Wno-deprecated-declarations --expt-extended-lambda --expt-relaxed-constexpr -dc -Dlink -lcudart -lcudrand -lcudadevrt -lcublas -lcublas_device -gencode arch=compute_30,code=compute_30 -x cu -dc /home/developer/Source/Foo/src/foo/gpu/gpu_camera.cu -o CMakeFiles/foo_cuda.dir/src/foo/gpu/gpu_camera.cu.o
/usr/include/unistd.h(792): error: expected an identifier

标签: cudalinkernvccunistd.h

解决方案


显示第 792 行的内容/usr/include/unistd.h可以让人们更好地猜测答案。

通常,此错误由于您#include unistd.h使用冲突的#define

例如,如果第 792 行unistd.h读取:

extern int link (const char *__from, const char *__to);

一些以前的标题是这样做的:

#define link 1

然后编译器将看到(预处理后):

extern int 1 (const char *__from, const char *__to);

并将正确地生产error: expected an identifier.

诊断这类问题的一个有用方法是运行预处理器保存所有#defines 的值。使用 GCC:

gcc -E -dD -I... foo.c > foo.e

类似的标志 ( -E -dD) 可能适用于nvcc,或者您可能必须找到等效的标志。

更新:

正如 Robert Crovella 所指出的,您实际上已经-Dlink在命令行上,因此您很可能unistd.h与我的匹配,并且extern int 1 (const char ...正是您的编译器在预处理后看到的内容

不要那样!也就是说,不要#define使用标准标识符(在命令行或代码中的任何其他位置)。


推荐阅读