NVCC + Cereal,没有这样的文件或目录

时间:2017-11-30 06:53:41

标签: c++ compiler-errors cuda header-files nvcc

这个问题注定要重复,直到所有具体情况都用完为止。但这一次真的令人费解,因为解决“#includes”通常不是问题。

状况

IDE:Nsight

Cuda varsion:cuda-9.0

GPU可计算性:3.7

程序结构

main.cu
     |
     #include GPU_in_grig.cuh - defines class and C-structures with serialization functions
           |                   - #includes <cereal/archives/binary.hpp>
           #include NN_def.cuh - defines C-structure, also with serialization functions
                               - #includes <cereal/archives/binary.hpp> <- ERROR

错误

14:14:19 ** Incremental Build of configuration Debug for project cuda_managed_v0_2 **
    make all 
    Building file: ../source_code/main.cu
    Invoking: NVCC Compiler
    /usr/local/cuda-9.0/bin/nvcc -I"/home/mgaraj/cuda-workspace/cuda_managed_v0_2/source_code/cereal" -G -g -O0 -std=c++11 -gencode arch=compute_37,code=sm_37  -odir "source_code" -M -o "source_code/main.d" "../source_code/main.cu"
    In file included from ../source_code/GPU_in_grid.cuh:15:0,
                     from ../source_code/main.cu:9:
    ../source_code/NN_def.hpp:18:38: fatal error: cereal/archives/binary.hpp: No such file or directory
    compilation terminated.
    make: * [source_code/main.o] Error 1
    source_code/subdir.mk:21: recipe for target 'source_code/main.o' failed

    14:14:19 Build Finished (took 172ms)

谷类

对于不熟悉谷类库的人来说,这只是一个标题库,只是将我的项目复制粘贴到文件夹source_code中,所有代码都驻留在该文件夹中。

enter image description here

上面显示了有问题的文件,导致编译错误。请注意,该文件位于source_code / cereal / archives中,这是-cereal / archives / binary.hpp-,因为错误有抱怨。

我的代码

#ifndef NN_DEF_H_
#define NN_DEF_H_

//==========================================================//
//                      INCLUDES                            //
//==========================================================//
// std::cout
#include <iostream>

// Cereal - serialization
#include <cereal/archives/binary.hpp>
#include <cereal/archives/portable_binary.hpp>


//==========================================================//
//                      PARAMETERS                          //
//==========================================================//
// OMITTED

//==========================================================//
//                      CLASS DEFINITION                    //
//==========================================================//
class NN{
public:
    bool check_limits(void);
    void print(void);

public:
    //==========================//
    //          CONTENT         //
    //==========================//
    float weight[NN_layer][NN_neuron][NN_weight];
    // ensure the size of NN_layout equals the NN_layer parameter
    int layout[NN_layer] = NN_layout;

    // debugging parameter
    int debug;

    //==========================//
    //      SERIALIZATION       //
    //==========================//
    // function required by cereal library
    template<class Archive>
    void serialize(Archive & ar){
        ar( cereal::binary_data( weight , sizeof(float) * NN_layer * NN_neuron * NN_weight));
        ar( cereal::binary_data( layout , sizeof(float) * NN_layer) );
        ar( debug );
    }


};

//==========================================================//
//                      FUNCTION DEFINITION                 //
//==========================================================//

bool NN::check_limits(void){
// OMITTED
};

void NN::print(void){
// OMITTED
}

#endif /* NN_DEF_H_ */

我为应对错误所做的工作

  1. 测试了#include“...”和#include&lt; ...&gt;
    • 当使用#include“...”选项时,编译器会产生相同的错误,但是文件在Cereal库中,#include“cereal / cereal.hpp”,在binary.hpp中
  2. 使用NVCC选项-I包含文件夹/ source_code / cereal
    • 没有区别,仍然是同样的错误
  3. 将NN_def.cuh重命名为NN_def.h,NN_def.hpp以强制标准c ++编译器处理编译
    • 没有区别
  4. 问题

    为什么错误如此持久? NVCC编译器是否会导致问题?它与我的代码有关吗?

1 个答案:

答案 0 :(得分:1)

NVCC(或简称编译器),当提供-I选项时,“/ source_code / cereal”,不理解与#include“cereal / archives / binary.hpp”的重叠。重叠是两个路径中包含的“cereal /”目录。

只需让编译器知道-I =“/ source_code”,就可以解决问题,因为#include“cereal / archives / binary.hpp”会被附加到-I选项,从而产生“source_code / cereal /” archives / binary.hpp“path。