c++ - Boost - 链接期间的多个定义
问题描述
我有这两个类(我们称它们为A
和B
),它们都包括 boost/archive 和 boost/序列化文件。这些包含在我的 hpp 文件(带有标题保护)中,用于两个类中的每一个。类A
(和代码库的其他部分)包含类B
,因此重复完全相同的包含。
据我了解,boost 库中的标头保护应该防止库文件再次包含在此处;但情况似乎并非如此。我什至在包含块周围放置了另一个标头保护,以确保它不会被多次包含;然而在链接时我得到了一个多重定义的错误。
包括在类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{/*...*/};
并且类在其头文件中B
具有相同的包含块(和保护)。_BOOST_INCLUDES_
代码的其他部分在某些时候也包含类A
或类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 文件),放入头文件就会导致多重定义的符号。
在没有你的代码的情况下,我在这个网站上有很多完整的例子。我会搜索“用户:85371 boost_class_export_key”:
- 尝试使用 boost::serialization 通过 boos::asio 套接字发送派生类
- 序列化多态接口
- BOOST_CLASS_EXPORT_* 宏不像 register_type() 那样工作
- 提升序列化,按基类型加载归档类会给出错误数据
- Boost Serialization - 以多个 CPP 文件导出
- 尽管一切看起来都正确,为什么 boost::serialize 不起作用?(“未注册的班级”)
他们中的大多数人都有在线多文件现场演示,并包含在答案文本中。
推荐阅读
- swift - 协议中的 Swift UIViewController 子类变量
- unit-testing - 如果显示错误代码,如何使用 cmocka 进行调试
- c++ - 编写函数来计算从 0 到 n 的设置位,
- angular - 如何在第一个可观察输出用作第二个输入的时候进行 2 个可观察 / 2 个 http 调用?
- react-native - 如何在安装 react-native-splash-screen 时修复错误
- git - 当文件中的所有差异都发生冲突时,Mac FileMerge 无法正常工作
- javascript - NODE JS / OIDC Passport-azure-ad openid,无法将“oid”登录与数据库中的用户匹配
- php - 尝试对包含多个字符串的列进行排序(我的雇主有一些限制)
- java - FTPS协议版本
- linux - 如何将特定列转换为标题大小写