在Ubuntu22.04.2 LTS平台编译Piccolo时出错,求大佬们赐教,感激不尽!

发布于

错误信息如下:

In file included from /home/yangfan/Dev/Piccolo-YF/engine/source/runtime/core/meta/reflection/reflection_register.cpp:6:

/home/yangfan/Dev/Piccolo-YF/engine/source/runtime/core/meta/serializer/serializer.h: In instantiation of ‘static Json Piccolo::Serializer::write(const T&) [with T = std::vector<Piccolo::ObjectInstanceRes>; Json = json11::Json]’:

/home/yangfan/Dev/Piccolo-YF/engine/source/_generated/serializer/all_serializer.ipp:48:66:   required from here

/home/yangfan/Dev/Piccolo-YF/engine/source/runtime/core/meta/serializer/serializer.h:67:31: error: static assertion failed: Serializer::write<T> has not been implemented yet!

  67 |                 static_assert(always_false<T>, "Serializer::write<T> has not been implemented yet!");


serializer.h第67行所在的函数:

template<typename T>

static Json write(const T& instance)

{

   if constexpr (std::is_pointer<T>::value)

    {

          return writePointer((T)instance);

   }

   else

   {

       static_assert(always_false<T>, "Serializer::write<T> has not been implemented yet!");

       return Json();

    }

}

看样子是if中的“std::is_pointer<T>::value”为false,执行了断言的那个分支。但我是C++萌新,不太明白为什么会为false,毫无头绪求大佬们赐教。

在windows上能编译通过,最近在捣鼓Linux,试着在Ubuntu上编译下就出现了这个问题。已经按照网上的C++环境教程安装了最新版本的gcc g++等编译器和库,查了下编译器是支持c++17的。也按照Piccolo的Readme安装了相关的包。使用"Release"配置编译。

评论 1
收藏
  • 我最近在捣鼓Piccolo引擎的时候也遇到了相似的问题,这个问题是编译器认为没有实现Piccolo::ObjectInstanceRes这个类的模板特化,但是一般如果生成没有问题的话,应该在all_serializer.ipp中已经实现了这个类的模板特化。所以先检查.ipp文件中有没有ObjectInstanceRes这个类的模板特化,没有的话就是反射代码生成序列化和反序列化代码过程中出了问题。如果有的话,大概率是不小心删了某些.cpp文件中的#include,导致头文件引入顺序错了,编译器认为只有定义,没有实现。我的情况是在asset_manager.cpp中删了#include "_generated/serializer/all_serializer.h"导致的。以上仅供参考。