Ubuntu下使用boost::json头文件出现多重定义链接错误求助
解决Boost.JSON头文件包含导致的链接多重定义错误
问题根源
你在头文件中包含<boost/json/src.hpp>是错误的——这个头文件是单编译单元专用的实现头,它会把Boost.JSON的所有函数实现直接嵌入到包含它的文件里。如果头文件被多个.cpp文件包含,每个编译单元都会生成一份Boost.JSON的实现代码,链接时就会出现大量multiple definition错误。#pragma once只能阻止头文件在单个编译单元内重复包含,无法解决跨编译单元的重复定义问题。
解决方案
方案1:分离接口与实现(推荐单文件编译场景)
- 头文件只包含Boost.JSON的接口头,不要包含实现头
- 在唯一的一个
.cpp文件中包含<boost/json/src.hpp>
修正后的头文件(MyClass.hpp)
#pragma once #include <boost/json.hpp> // 仅包含接口声明,无实现代码 class MyClass { public: static void processJson(const boost::json::object& obj); };
实现文件(MyClass.cpp)
#include "MyClass.hpp" #include <boost/json/src.hpp> // 在这里引入所有实现,整个项目只需要包含一次 void MyClass::processJson(const boost::json::object& obj) { // 你的业务逻辑实现 }
方案2:使用预编译的Boost.JSON库(适合大型项目)
如果你的项目是多文件结构,更推荐编译Boost库并链接预编译的Boost.JSON模块:
- 编译Boost库时启用JSON模块(使用
b2编译时添加--with-json参数) - 头文件中依然只包含
<boost/json.hpp> - 编译时添加链接参数:
-lboost_json
这样所有编译单元共享预编译的库文件,不会出现重复定义问题。
内容的提问来源于stack exchange,提问作者Mendes
相关产品推荐
相关产品推荐

