这个问题注定要重复,直到所有具体情况都用尽为止。但这一次确实令人困惑,因为解决“#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)

Cereal Cereal

对于不熟悉 Cereal 库的人们,这是仅 header 的库,只需将其复制粘贴到我的项目中,并将其复制到所有代码所在的文件夹source_code中。

c&#43;&#43; - NVCC &#43; Cereal,没有此类文件或目录-LMLPHP

上面显示了有问题的文件,导致编译错误。请注意,该文件位于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_ */

我为解决错误而采取的措施
  • 测试了#include“...”和#include
  • 使用#include“...”选项时,编译器会产生相同的错误,但二进制文件中的Cereal库中的文件#include“cereal/cereal.hpp”包含在binary.hpp中。
  • 使用NVCCs选项-I包含文件夹/source_code/cereal
  • 没有区别,仍然是相同的错误
  • 将NN_def.cuh重命名为NN_def.h,NN_def.hpp,以强制标准c++编译器处理该编译
  • 没有区别


  • 问题

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

    最佳答案

    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”路径。

    09-26 00:03