编译使用tinyxml

时间:2021-11-22 18:50:56

环境:

win7 32位旗舰版,VS2010,tinyxml_2_6_2版本

1、下载tinyxml,并解压到tinyxml文件夹下

2、生成动态链接库

原生的Tinyxml只支持静态库(没有在.h文件中找到任何的导出类或导出函数),并且生成的静态库比较大,Release下大约2.5M。

打开VS2010 -> 新建win32项目 -> 下一步 -> 勾选"DLL” ->  完成

将tinyxml文件夹下所有的.h/.cpp文件复制到改工程目录下

打开tinyxml.h头文件,定义以下宏

#define TIXML_USE_STL//使用STL
#define TIXML_DLL//DLL项目
#define TIXML_DLL_EXPORT//DLL导出 #ifdef TIXML_DLL #ifdef TIXML_DLL_EXPORT #define TIXML_DLL_API _declspec(dllexport) #else #define TIXML_DLL_API _declspec(dllimport) #endif #else #define TIXML_DLL_API #endif

在所有需要导出类前面加上TIXML_DLL_API宏

class TIXML_DLL_API TiXmlVisitor
{
}; class TIXML_DLL_API TiXmlNode : public TiXmlBase
{
}; class TIXML_DLL_API TiXmlAttribute : public TiXmlBase
{
}; class TIXML_DLL_API TiXmlAttributeSet
{
}; class TIXML_DLL_API TiXmlElement : public TiXmlNode {
}; class TIXML_DLL_API TiXmlComment : public TiXmlNode
{
}; class TIXML_DLL_API TiXmlText : public TiXmlNode
{
}; class TIXML_DLL_API TiXmlDeclaration : public TiXmlNode
{
}; class TIXML_DLL_API TiXmlUnknown : public TiXmlNode
{
}; class TIXML_DLL_API TiXmlDocument : public TiXmlNode
{
}; class TIXML_DLL_API TiXmlHandle
{
}; class TIXML_DLL_API TiXmlPrinter : public TiXmlVisitor
{
};

为了在保存xml文件的时候为UTF-8编码,在TiXmlDocument类的三个构造函数中设置useMicrosoftBOM=true

TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
{
tabsize = 4;
useMicrosoftBOM = true;//保存为UTF-8格式
ClearError();
} TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
{
tabsize = 4;
useMicrosoftBOM = true;//保存为UTF-8格式
value = documentName;
ClearError();
} #ifdef TIXML_USE_STL
TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
{
tabsize = 4;
useMicrosoftBOM = true;//保存为UTF-8格式
value = documentName;
ClearError();
}
#endif

编译生成Debug和Release,这里需要同时生成,我在上面的DLL导出函数接口中使用了非内置类型(如std::string等等),必须使用相同版本的lib和dll库,否则会出现莫名其妙的错误.

3、使用Tinyxml动态链接库

新建一个控制台应用程序

直接编译生成Debug和Release版本

将编译好的Debug下的tinyxml.lib和tinyxml.dll复制到当前工程下的Debug目录下

将编译好的Release下的tinyxml.lib和tinyxml.dll复制到当前工程下的Release目录下

#include "tinyxml.h"

//////////////////////////////////////////////////////////////////////////
// 由于DLL导出函数接口中使用了非内置类型(如std::string等等),必须使用相同版本
// 的lib和dll库,否则会出现莫名其妙的错误.
//////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
#pragma comment(lib, "../Debug/tinyxml.lib")
#else
#pragma comment(lib, "../Release/tinyxml.lib")
#endif

删除tinyxml.h头文件中定义的宏#define TIXML_DLL_EXPORT

下一章会说编码(UNICODE/UTF-8/ASCII)如何转换的问题,并以CMarkup的操作xml形式对Tinyxml进行封装,使用起来更加方便^^