无法使用 nvcc 找到 Torch 头文件

Posted

技术标签:

【中文标题】无法使用 nvcc 找到 Torch 头文件【英文标题】:Unable to find Torch header files using nvcc 【发布时间】:2016-01-19 18:29:48 【问题描述】:

我正在尝试从 luaJIT (Torch) 调用一些 CUDA 代码,但我遇到了编译问题。 nvcc 似乎无法找到我的 Torch 头文件。我有 CUDA 6.5 和 gcc 4.4.7。

nvcc -o im2col -I/deep/u/ibello/torch/include im2col.cu    
In file included from /deep/u/ibello/torch/include/THC/THC.h:4,
                     from utils.h:6,
                     from im2col.cu:1:
    /deep/u/ibello/torch/include/THC/THCGeneral.h:4:23: error: THGeneral.h: No such file or directory
    /deep/u/ibello/torch/include/THC/THCGeneral.h:5:25: error: THAllocator.h: No such file or directory
    In file included from /deep/u/ibello/torch/include/THC/THC.h:7,
                     from utils.h:6,
                     from im2col.cu:1:
    /deep/u/ibello/torch/include/THC/THCStorage.h:4:23: error: THStorage.h: No such file or directory
    In file included from /deep/u/ibello/torch/include/THC/THC.h:9,
                     from utils.h:6,
                     from im2col.cu:1:

im2col.cu 包含以下内容

#include "utils.h"
#include "common.h"
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

“utils.h”在哪里

#ifndef CUNN_UTILS_H
#define CUNN_UTILS_H

extern "C"  #include <lua.h> 
#include <luaT.h>
#include <THC/THC.h>

THCState* getCutorchState(lua_State* L);

#endif

这比较奇怪,因为提到的文件确实在我给编译器的包含位置..

ls /deep/u/ibello/torch/include/THC
THCAllocator.h  THCDeviceTensor.cuh       THCDeviceTensorUtils-inl.cuh  THC.h                    THCReduce.cuh     THCTensorConv.h  THCTensorMath.h
THCApply.cuh    THCDeviceTensor-inl.cuh   THCDeviceUtils.cuh            THCReduceAll.cuh         THCStorageCopy.h  THCTensorCopy.h  THCTensorRandom.h
THCBlas.h       THCDeviceTensorUtils.cuh  THCGeneral.h                  THCReduceApplyUtils.cuh  THCStorage.h      THCTensor.h      THCTensorSort.h

关于我做错了什么有什么想法吗?

提前谢谢!

【问题讨论】:

它正在寻找 THGeneral.h 并且您已经显示了 THCGeneral.h 的位置。这些不是同一个文件。也许您还需要包含THGeneral.h 和其他类似文件的路径:-I/deep/u/ibello/torch/path/to/THGeneral.h 这就是问题所在! THGeneral.h 在我提供的路径的子目录中,所以不知道为什么这不起作用.. 编译器不会搜索您提供的路径的所有子目录。他们只搜索您提供的目录。 THC 文件位于 ..../torch/include/THC,而 TH 文件位于 ..../torch/include/TH。在这里,编译器能够找到 THC 文件,但不能找到 TH 文件(它们是从 THC 文件中#included 的)。所以编译器至少能够搜索到 THC 子目录 当您指定 -I/deep/u/ibello/torch/include 时,编译器找到了进入 .../include/THC 的方式,因为这个构造:#include &lt;THC/THC.h&gt; 一旦它“在那个目录中”,可能会发现来自 THC.h 的其他文件在 THC.h 所在的目录中。如果您仔细阅读您的帖子,您可以看到这一点。但是,这些机制都不允许它发现 .../include/TH 中的文件,除非您将其指向那里,或者包含文件指定了部分路径,例如 #include "../TH/THGeneral.h" 【参考方案1】:

好像这个编译命令:

nvcc -o im2col -I/deep/u/ibello/torch/include im2col.cu 

没有为编译器提供必要的搜索路径来查找位于/deep/u/ibello/torch/include/TH 中的诸如THGeneral.h 之类的头文件

解决方案是指定这样的编译命令:

nvcc -o im2col -I/deep/u/ibello/torch/include -I/deep/u/ibello/torch/include/TH im2col.cu 

【讨论】:

以上是关于无法使用 nvcc 找到 Torch 头文件的主要内容,如果未能解决你的问题,请参考以下文章

NVCC 无法处理 MSVC 编译器选项中的嵌套引号

为啥 Visual Studio 编译器无法找到某些头文件而 intellisense 可以?

如何配置 mex 以将编译器标志传递给 nvcc

无法使用 sudo 命令编译 cuda

nvcc 致命:无法检测主机编译器属性

Xcode 8.2 无法从添加的搜索路径中找到头文件?