【问题标题】:boost serialization linker error when defining NDEBUG定义 NDEBUG 时提升序列化链接器错误
【发布时间】:2014-04-18 01:01:55
【问题描述】:

boost::serialization 链接时,我的项目“发布”版本出现问题。我的“调试”和“发布”版本之间唯一真正的区别是我在调试中定义了DEBUG 并使用-O0,我在发布中定义了NDEBUG 并使用-O3

我可以在调试模式下完全编译、链接和运行。

但是,当我使用发布模式编译时,它会编译正常但在链接过程中失败并出现以下错误:

/home/jarrett/projects/icebreakers/glr/build/libglr.a(ModelManager.o): In function `serialize<boost::archive::text_iarchive, glr::models::Model>':
/home/jarrett/projects/icebreakers/glr/deps/boost/include/boost/serialization/access.hpp:118: undefined reference to `void glr::models::Model::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive&, unsigned int)'
/home/jarrett/projects/icebreakers/glr/build/libglr.a(ModelManager.o): In function `serialize<boost::archive::text_oarchive, glr::models::Model>':
/home/jarrett/projects/icebreakers/glr/deps/boost/include/boost/serialization/access.hpp:118: undefined reference to `void glr::models::Model::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)'
/home/jarrett/projects/icebreakers/glr/build/libglr.a(TextureManager.o): In function `serialize<boost::archive::text_iarchive, glr::glw::Texture2D>':
/home/jarrett/projects/icebreakers/glr/deps/boost/include/boost/serialization/access.hpp:118: undefined reference to `void glr::glw::Texture2D::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive&, unsigned int)'
/home/jarrett/projects/icebreakers/glr/build/libglr.a(TextureManager.o): In function `serialize<boost::archive::text_oarchive, glr::glw::Texture2D>':
/home/jarrett/projects/icebreakers/glr/deps/boost/include/boost/serialization/access.hpp:118: undefined reference to `void glr::glw::Texture2D::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)'
/home/jarrett/projects/icebreakers/glr/build/libglr.a(AnimationManager.o): In function `serialize<boost::archive::text_iarchive, glr::glw::Animation>':
/home/jarrett/projects/icebreakers/glr/deps/boost/include/boost/serialization/access.hpp:118: undefined reference to `void glr::glw::Animation::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive&, unsigned int)'
/home/jarrett/projects/icebreakers/glr/build/libglr.a(AnimationManager.o): In function `serialize<boost::archive::text_oarchive, glr::glw::Animation>':
/home/jarrett/projects/icebreakers/glr/deps/boost/include/boost/serialization/access.hpp:118: undefined reference to `void glr::glw::Animation::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)'
collect2: error: ld returned 1 exit status
scons: *** [build/darkhorizon] Error 1
scons: building terminated because of errors.

我不明白这一点,因为所讨论的方法已完全定义。我不会在这些类的代码中执行任何类型的#ifdef NDEBUG 等宏。

有人明白为什么会发生这种情况吗?

我的 Texture2D 课程
Texture2D.hpp
Texture2D.cpp

我的 TextureManager 类
TextureManager.hpp
TextureManager.cpp

如果有帮助,我很乐意提供更直接/本地化的代码 sn-ps。

更新:如果我将serialize 方法的定义移动到头文件中,它会突然链接!我想这与它们是模板方法有关,但我仍然不明白为什么我的“调试”构建工作但我的“发布”构建却没有......

【问题讨论】:

    标签: c++ serialization boost


    【解决方案1】:

    确实是因为这个。显然在 DEBUG 构建中,模板实例化获得外部链接(这在启用优化时很不寻常,因为很可能(顶层)调用可以内联。

    另见

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2013-01-21
      • 2018-08-29
      • 2020-09-12
      • 2019-11-25
      • 2012-02-02
      • 2016-09-22
      • 2015-07-22
      相关资源
      最近更新 更多