尝试链接时编译错误 <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"
当我包含<boost\property_tree\json_parser.hpp>
时,我收到许多错误,表明我正在重新定义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
声明 near
和 far
;我在代码中广泛使用的名称。
因此您包含了一些内容,而这些内容又包含一些 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>的主要内容,如果未能解决你的问题,请参考以下文章
尝试将ImageMagick用作Visual Studio编译器的静态库时出现链接器错误