Fatal error: cuda.h: No such file or directory
Fatal error: cuda.h: No such file or directory
我在我的电脑上成功安装了 CUDA 8.0,我可以通过 运行 在我的 Ubuntu 16.10 中使用以下命令查看它的文件:
$ sudo find / -name nvcc
/usr/local/cuda-8.0/bin/nvcc
$ sudo find / -name cuda
/usr/local/cuda
/usr/local/cuda-8.0/targets/x86_64-linux/include/thrust/system/cuda
/usr/share/doc/cuda
/usr/include/nvidia-367/cuda
然后,我得到了以下源代码(has_cuda.c)来检查是否安装了CUDA:
#include<cuda.h>
int main ()
{
int deviceCount;
cudaError_t e = cudaGetDeviceCount(&deviceCount);
return e == cudaSuccess ? deviceCount : -1;
}
但是运行这段代码returns我出现了以下错误:
$ gcc has_cuda.c
has_cuda.c:1:17: fatal error: cuda.h: No such file or directory
#include<cuda.h>
^
compilation terminated.
我在我的目录中查找 cuda.h 并在以下位置找到它们:
$ sudo find / -name cuda.h
/usr/local/cuda-8.0/targets/x86_64-linux/include/cuda.h
/usr/include/nvidia-367/cuda/cuda.h
/usr/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-22/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-22/include/uapi/linux/cuda.h
/usr/src/linux-headers-4.8.0-32/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-32/include/uapi/linux/cuda.h
我在这方面是菜鸟,所以,会发生什么?我是否必须导出任何变量以指出 cuda.h 在哪里?我该怎么做?
我自己从未编译过 cuda 项目,但我认为您需要 link 编译器的库。
一些快速谷歌搜索说 Nvidia 有编译器可以处理所有事情。所以你只需要安装它就可以了。它被称为 NVVC。安装后 运行:
nvcc helloworld.cu -o hello.out
对于像这样的外部库,您几乎总是需要 link 它们。对于标准库,您不必这样做,因为 linker 已经知道在哪里可以找到它。
正确的包含 header 文件不是 cuda.h
,而是 cuda_runtime.h
,假设您想使用 gcc
作为此代码的编译器。正如另一个答案所指出的那样,您可以只使用 nvcc
(它已经安装在您的机器上),它根本不需要任何包含 header 的代码。
如果您想使用 nvcc
,您可能应该确保设置了适当的 PATH
环境变量。此信息和其他有用信息包含在 linux install guide.
中
因此,如果您像这样修改代码:
#include <cuda_runtime.h>
int main ()
{
int deviceCount;
cudaError_t e = cudaGetDeviceCount(&deviceCount);
return e == cudaSuccess ? deviceCount : -1;
}
您应该能够使用如下命令成功编译它:
gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda
-I
开关后的路径应包含您计算机上 cuda_runtime.h
的路径。通常会像上面那样设置,但我不确定你的机器上是否设置了 cuda
符号链接,而且你的 include 目录看起来可能在一个不寻常的地方,即
/usr/local/cuda-8.0/targets/x86_64-linux/include
但是您可以像以前一样使用 find
来定位它。
同样,-L
开关之后的路径需要是您的 cuda lib64
目录的路径,该目录将包含 libcudart.so 及其表亲。同样,这通常会在我显示的路径上进行符号链接,但您的机器安装可能不符合我的期望。您应该能够使用 find
找到正确的路径。
并且如另一个答案所示,如果您使用 nvcc
(您已经找到),则不需要显式 select -I
和 -L
路径。使这项工作最简单的方法是将文件从 has_cuda.c
重命名为 has_cuda.cu
,然后您应该能够像这样编译:
nvcc has_cuda.cu -o has_cuda
最后,Ubuntu 16.10 目前不是 CUDA 官方支持的发行版,因此它在您机器上的安装方式可能有些出乎意料。我鼓励您阅读之前链接的安装指南,因为它包含有关 post-installation 设置步骤的有用信息,例如设置环境变量,以及如何 "verify" CUDA 安装。
任何时候你运行宁 CUDA 代码,并遇到任何麻烦,请确保使用 proper cuda error checking 和 运行 你的代码 cuda-memcheck,比如所以:
cuda-memcheck ./has_cuda
即使您不理解报告的错误信息,它也可能对那些试图帮助您的人有用。
我在我的电脑上成功安装了 CUDA 8.0,我可以通过 运行 在我的 Ubuntu 16.10 中使用以下命令查看它的文件:
$ sudo find / -name nvcc
/usr/local/cuda-8.0/bin/nvcc
$ sudo find / -name cuda
/usr/local/cuda
/usr/local/cuda-8.0/targets/x86_64-linux/include/thrust/system/cuda
/usr/share/doc/cuda
/usr/include/nvidia-367/cuda
然后,我得到了以下源代码(has_cuda.c)来检查是否安装了CUDA:
#include<cuda.h>
int main ()
{
int deviceCount;
cudaError_t e = cudaGetDeviceCount(&deviceCount);
return e == cudaSuccess ? deviceCount : -1;
}
但是运行这段代码returns我出现了以下错误:
$ gcc has_cuda.c
has_cuda.c:1:17: fatal error: cuda.h: No such file or directory
#include<cuda.h>
^
compilation terminated.
我在我的目录中查找 cuda.h 并在以下位置找到它们:
$ sudo find / -name cuda.h
/usr/local/cuda-8.0/targets/x86_64-linux/include/cuda.h
/usr/include/nvidia-367/cuda/cuda.h
/usr/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-22/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-22/include/uapi/linux/cuda.h
/usr/src/linux-headers-4.8.0-32/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-32/include/uapi/linux/cuda.h
我在这方面是菜鸟,所以,会发生什么?我是否必须导出任何变量以指出 cuda.h 在哪里?我该怎么做?
我自己从未编译过 cuda 项目,但我认为您需要 link 编译器的库。
一些快速谷歌搜索说 Nvidia 有编译器可以处理所有事情。所以你只需要安装它就可以了。它被称为 NVVC。安装后 运行:
nvcc helloworld.cu -o hello.out
对于像这样的外部库,您几乎总是需要 link 它们。对于标准库,您不必这样做,因为 linker 已经知道在哪里可以找到它。
正确的包含 header 文件不是 cuda.h
,而是 cuda_runtime.h
,假设您想使用 gcc
作为此代码的编译器。正如另一个答案所指出的那样,您可以只使用 nvcc
(它已经安装在您的机器上),它根本不需要任何包含 header 的代码。
如果您想使用 nvcc
,您可能应该确保设置了适当的 PATH
环境变量。此信息和其他有用信息包含在 linux install guide.
因此,如果您像这样修改代码:
#include <cuda_runtime.h>
int main ()
{
int deviceCount;
cudaError_t e = cudaGetDeviceCount(&deviceCount);
return e == cudaSuccess ? deviceCount : -1;
}
您应该能够使用如下命令成功编译它:
gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda
-I
开关后的路径应包含您计算机上 cuda_runtime.h
的路径。通常会像上面那样设置,但我不确定你的机器上是否设置了 cuda
符号链接,而且你的 include 目录看起来可能在一个不寻常的地方,即
/usr/local/cuda-8.0/targets/x86_64-linux/include
但是您可以像以前一样使用 find
来定位它。
同样,-L
开关之后的路径需要是您的 cuda lib64
目录的路径,该目录将包含 libcudart.so 及其表亲。同样,这通常会在我显示的路径上进行符号链接,但您的机器安装可能不符合我的期望。您应该能够使用 find
找到正确的路径。
并且如另一个答案所示,如果您使用 nvcc
(您已经找到),则不需要显式 select -I
和 -L
路径。使这项工作最简单的方法是将文件从 has_cuda.c
重命名为 has_cuda.cu
,然后您应该能够像这样编译:
nvcc has_cuda.cu -o has_cuda
最后,Ubuntu 16.10 目前不是 CUDA 官方支持的发行版,因此它在您机器上的安装方式可能有些出乎意料。我鼓励您阅读之前链接的安装指南,因为它包含有关 post-installation 设置步骤的有用信息,例如设置环境变量,以及如何 "verify" CUDA 安装。
任何时候你运行宁 CUDA 代码,并遇到任何麻烦,请确保使用 proper cuda error checking 和 运行 你的代码 cuda-memcheck,比如所以:
cuda-memcheck ./has_cuda
即使您不理解报告的错误信息,它也可能对那些试图帮助您的人有用。