Boost - 链接期间的多个定义

Boost - Multiple definitions during linking

我有这两个 classes(我们称它们为 AB),它们都包含 boost/archive 和 boost/serialization 文件。对于两个 classes 中的每一个,这些包含在我的 hpp 文件中(带有 header 守卫)。 Class A(以及代码库的其他部分)包括 class B 并因此重复完全相同的包含。

根据我的理解,boost 库中的 header 守卫应该阻止库文件在这里被第二次包含;但事实似乎并非如此。 我什至在 include bloc 周围放置了另一个 header 守卫,只是为了确保它不会被多次包含;但是在链接时我得到了多重定义的错误。

包含在 class A:

#ifndef _A_H
#define _A_H


// Other none boost includes for class A
#ifndef _BOOST_INCLUDES_
#define _BOOST_INCLUDES_
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#endif

class A{/*...*/};

和class B 在其header 文件中具有相同的包含块(和_BOOST_INCLUDES_ 保护)。代码的其他部分在某些时候还包括 class A 或 class B,但问题源于此处包含的内容。

为什么会这样(我该如何解决)?为什么 boost header 守卫不阻止第二次包含?这可能与代码本身无关,而是构建问题吗?

Makefile 提取:

BOOST_ROOT  := myPathToBoost/boost_1_75_0/
BOOST_LIBS  := -L$(BOOST_ROOT)stage/lib/ -lboost_serialization
BOOST       := -I $(BOOST_ROOT) $(BOOST_LIBS)

$(CM_OBJS): $(CM_SOURCES)
    $(CC) $(FLAGS) -MMD $(BOOST) -c $(INCLUDES) -o $@ $< $(LIBS)

链接器错误是:

/usr/bin/ld: /projectPath/build/clientMain.o:(.bss+0x0): multiple definition of `boost::archive::detail::extra_detail::init_guid<EndGame>::g'; /projectPath/build/Register.o:(.bss+0x0): first defined here

并且此消息对每个包含重复;文件名不同,::init_guid<X> 的内容也不同。

确实,将 BOOST_CLASS_EXPORT 放入头文件会导致在将头文件包含到多个翻译单元(想想 .cpp 文件)中后立即定义多个符号。

在没有你的代码的情况下,我在这个网站上有很多完整的例子。我会搜索“user:85371 boost_class_export_key”:

  • Serialize Polymorph Interface
  • BOOST_CLASS_EXPORT_* macros are not working like register_type()
  • Boost Serialization - Exporting in multiple CPP files

他们中的大多数都有在线的多文件现场演示,并包含在答案文本中。