尝试链接时编译错误 <boost\property_tree\json_parser.hpp>

Posted

技术标签:

【中文标题】尝试链接时编译错误 <boost\\property_tree\\json_parser.hpp>【英文标题】:Compile errors when attempting to link <boost\property_tree\json_parser.hpp>尝试链接时编译错误 <boost\property_tree\json_parser.hpp> 【发布时间】:2013-11-26 07:56:09 【问题描述】:

我的项目中有以下“包含”文件。

#pragma once

//glm
#include <glm\glm.hpp>
#include <glm\ext.hpp>
#include <glm\gtc\matrix_transform.hpp>

//glew
#include "GL\glew.h"

//glfw
#define GLFW_DLL
#include "GLFW\glfw3.h"

//libpng
#include <png.h>

//std
#include <stdio.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <list>
#include <memory>
#include <iostream>
#include <fstream>
#include <assert.h>

//boost
#include <boost\filesystem.hpp>
#include <boost\property_tree\json_parser.hpp> /* problem */

//mandala
#include "types.h"
#include "type_traits.h"
#include "hash.h"
#include "macros.h"

当我包含&lt;boost\property_tree\json_parser.hpp&gt; 时,我收到许多错误,表明我正在重新定义APIENTRY,例如这个:

1>c:\program files (x86)\windows kits\8.0\include\shared\minwindef.h(130): warning C4005: 'APIENTRY' : macro redefinition

我很困惑为什么会这样。我试图通过将#define _MINWINDEF_ 放在include 语句之前来禁止处理minwindef.h 文件,但无济于事。有没有其他人遇到过这个问题或知道如何正确包含这个 boost 库?

注意

【问题讨论】:

您引用的内容是一个警告,而不是错误。但是同时包含大量不同的标题感觉非常错误。要么您包含不必要的标头,要么您违反了该文件中实现的类中的 SRP。或两者兼而有之。 对不起,我有错误警告。还有多个宏定义会导致错误,例如 minwindef.h 声明 nearfar;我在代码中广泛使用的名称。 因此您包含了一些内容,而这些内容又包含一些 WinAPI 标头。这些定义了大量的宏,有时甚至在不同的标题中不止一次。您永远不应该将这些宏名称用于您自己的宏或变量。我必须承认,令我惊讶的是,json_parser 将是包含这些标头的库,而不是 filesystem 库。 @ArneMertz 我也是这么想的,我真的很困惑为什么一个美化的文本解析器需要 Windows API。 @ArneMertz 你提到 SRP 违规让我将一些包含移动到它们使用的地方而不是大包含文件,我现在只有 WINAPI 重新定义警告(错误)到处理。 【参考方案1】:

由于您既没有更新您的问题以反映您对包含内容所做的更改,也没有提供完整的警告信息,我只能猜测:

在包含 WinAPI 标头的 boost 库之前仍然包含 glfw.h。因为当我只是在谷歌搜索“APIENTRY 重新定义”时,我得到this SO question 作为第一个结果,包括答案:将 WinAPI 标头(或包含它们的 boost 标头)放在 glfw.h 包含之前。

【讨论】:

将 glfw 包含到仅相关文件解决了问题。谢谢你。 :) @cmbasnett 从中吸取教训:请在询问 SO 之前使用谷歌。您通常会更快地得到答案。【参考方案2】:

您可能还想包含ptree

    #include <boost/property_tree/ptree.hpp>

【讨论】:

那会以什么方式删除 WinAPI 标头的包含?

以上是关于尝试链接时编译错误 <boost\property_tree\json_parser.hpp>的主要内容,如果未能解决你的问题,请参考以下文章

编译FFMPEG时Mac上的g ++链接错误

链接 C++ 程序时出错

尝试将ImageMagick用作Visual Studio编译器的静态库时出现链接器错误

使用 <experimental/filesystem> 并调用函数的链接器错误

编译时与 Boost.python 链接错误

qt creator qt5.1 vs2010 使用静态库时链接器错误