linux 动态库编译即使用,tinyxml在linux和windows下的编译及使用详解

一:摘要

1.XML全称EXtensible Markup Language,翻译为可扩展标记语言,XML文件通常就是一个文本文件,可以使用任何编码

2.TinyXML是一个开源的C++用来处理XML的第三方库

二:说明

1.本篇博客下载的是tinyxml_2_6_2版本,tinyxml_2_6_2下载地址:http://download.csdn.net/download/yzf279533105/9924003

2. 博客内容及所有代码均是在该版本下编译,运行,测试通过的,示例代码下载地址

windows下示例代码:http://download.csdn.net/download/yzf279533105/9942336

Linux下示例代码:(内有介绍文档,请按照文档步骤操作,保证可以运行成功)

使用静态库的示例代码:http://download.csdn.net/download/yzf279533105/9942600

使用动态库的示例代码:http://download.csdn.net/download/yzf279533105/9942605

三.Windows下的编译

1.从上面的地址下载得到tinyxml_2_6_2.zip文件,解压得到tinyxml_2_6_2文件夹

2.进入目录tinyxml_2_6_2/tinyxml,可以看到源代码一共2个头文件,4个源文件,分别是tinyxml.h,tinystr.h,tinyxml.cpp,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparse.cpp

3.由于tinyxml库很小,没必要编译成静态库或者动态库,把上面列举的6个文件拷贝到示例工程目录下即可直接使用

四.Windows下的使用

1.建立一个空的win32控制台工程,类似HellowWorld的工程即可,我这里工程命名为tinyxmlExample

2.在本示例工程根目录添加tinyxml文件夹,把上述列举的6个tinyxml文件拷贝到该目录下,在属性页 配置属性 -> C/C++ -> 常规 -> 附加包含目录 中设置该工程的头文件目录,即“../”,表示附加了根目录

3. 在工程中添加源文件,把整个tinyxml包含进来,这样所有的代码就包含进来了

4. 添加一个源文件main.cpp,代码如下:

#include #include "tinyxml/tinyxml.h"

using namespace std;

int main()

{

// 新建的xml文件名字

string filename = "example.xml";

新建一个xml文件

// 定义一个TiXmlDocument类指针

TiXmlDocument* pWriteDoc = new TiXmlDocument();

// xml的声明(三个属性:版本,编码格式,独立文件声明)

TiXmlDeclaration* pDeclare = new TiXmlDeclaration("1.0", "UTF-8", "yes");

pWriteDoc->LinkEndChild(pDeclare);// 连接到最后

// 根节点

TiXmlElement* pRootElement = new TiXmlElement("telephonebook");

pWriteDoc->LinkEndChild(pRootElement);// 把根节点连接到最后

// 二级节点

TiXmlElement* pPersonElement = new TiXmlElement("person");//通讯录节点

pRootElement->LinkEndChild(pPersonElement);// 连接到根节点下

// 三级节点

TiXmlElement* pNameElement = new TiXmlElement("name");

// 文本

TiXmlText* nameContent = new TiXmlText("xiaoming");// 通讯录名字

pNameElement->LinkEndChild(nameContent);// 给三级节点添加文本

pPersonElement->LinkEndChild(pNameElement);// 把三级节点连接到二级节点下

// 三级节点

TiXmlElement* pAddrElement = new TiXmlElement("addr");// 通讯录地址

// 设置属性

pAddrElement->SetAttribute("addr1","hubei");

pAddrElement->SetAttribute("addr2","wuhan");

pPersonElement->LinkEndChild(pAddrElement);// 把三级节点连接到二级节点下

// 三级节点

TiXmlElement* pEmailElement = new TiXmlElement("email");// 通讯录邮件

// 文本

TiXmlText* emailContent = new TiXmlText("1234567@qq.com");

pEmailElement->LinkEndChild(emailContent);// 给三级节点添加文本

pPersonElement->LinkEndChild(pEmailElement);// 把三级节点连接到二级节点下

///保存到文件

pWriteDoc->SaveFile(filename.c_str());

printf( "new xml success, file's name is %s\n\n", filename.c_str());

从文件中读取

// 定义一个TiXmlDocument类指针

TiXmlDocument* pReadDocument = new TiXmlDocument();

// 读取文件

if (!pReadDocument->LoadFile(filename.c_str()))

{

printf( "Could not load example xml file %s. Error='%s'\n", filename.c_str(),pReadDocument->ErrorDesc() );

return 0;

}

printf("read xml file success, file' name is %s \n\n",filename.c_str());

//读取文档声明信息(第一个子节点转换得到文档声明)

TiXmlDeclaration* pDeclar = pReadDocument->FirstChild()->ToDeclaration();

if (pDeclar != NULL)

{

printf("read declare, version is %s , encoding is %s\n",pDeclar->Version(), pDeclar->Encoding());

}

// 得到文件根节点

pRootElement = pReadDocument->RootElement();

遍历元素,打印

printf("begin read all xml element \n\n");

// 遍历所有的person

// 函数FirstChildElement():找到指定名字的元素

// 函数NextSiblingElement:在同一级元素中查找下一个指定名字的元素

int i = 0;

for (TiXmlElement* pItem = pRootElement->FirstChildElement("person"); pItem; pItem = pItem->NextSiblingElement("person"))

{

printf("read the %d person \n",++i);

// 名字

TiXmlElement* pName = pItem->FirstChildElement("name");

if (pName != NULL)

{

printf("the %d person's name = %s \n", i, pName->GetText());

}

// 地址

TiXmlElement* pAddr = pItem->FirstChildElement("addr");

if (pAddr != NULL)

{

// 第一个属性

TiXmlAttribute* pAddr1 = pAddr->FirstAttribute();

if (pAddr1 != NULL)

{

printf("the %d person's addr1 = %s \n", i, pAddr1->Value());

// 下一个属性

TiXmlAttribute* pAddr2 = pAddr1->Next();

if (pAddr2 != NULL)

{

printf("the %d person's addr2 = %s \n", i, pAddr2->Value());

}

}

}

printf("\n\n");

}

删除元素,属性

TiXmlElement* pPerson = pRootElement->FirstChildElement("person");

if (pPerson != NULL)

{

// 这里演示删除"email"元素,删除其他节点也是一样的办法

TiXmlElement* pEmail = pPerson->FirstChildElement("email");

if (pEmail != NULL)

{

pPerson->RemoveChild(pEmail);

}

// 这里演示修改"addr"元素

TiXmlElement* pAddr = pPerson->FirstChildElement("addr");

if (pAddr != NULL)

{

pAddr->SetAttribute("addr2", "huanggang");// 修改属性值

// 删除属性

//pAddr->RemoveAttribute("addr1");

}

}

//增加元素

// 新建一个元素,名字:person

TiXmlElement* pNewElement = new TiXmlElement("person");

// 给新建的元素创建子元素并连接到最后

TiXmlElement* pNameElementAdd = new TiXmlElement("name");// 元素:name

TiXmlText* pNameText = new TiXmlText("zhangsan");

pNameElementAdd->LinkEndChild(pNameText);// 该元素下添加文本内容

TiXmlElement* pAddrElementAdd = new TiXmlElement("addr");// 元素:addr

pAddrElementAdd->SetAttribute("addr1","guangdong");

pAddrElementAdd->SetAttribute("addr2","shenzhen");// 该元素下添加属性

TiXmlElement* pEmailElementAdd = new TiXmlElement("email");// 元素:email

TiXmlText* pEmailText = new TiXmlText("zhangsan@qq.com");

pEmailElementAdd->LinkEndChild(pEmailText);// 该元素下添加文本内容

// 都挂接到新建元素下

pNewElement->LinkEndChild(pNameElementAdd);

pNewElement->LinkEndChild(pAddrElementAdd);

pNewElement->LinkEndChild(pEmailElementAdd);

// 把这个新建元素挂在根节点最后

pRootElement->LinkEndChild(pNewElement);

printf("add new element success\n");

///再次保存到文件

if (pReadDocument->SaveFile(filename.c_str()))

{

printf("save file success\n");

}

getchar();

return 0;

}

五.Linux下的编译

1.从上面的地址下载得到tinyxml_2_6_2.zip文件,执行解压命令 unzip tinyxml_2_6_2.zip 得到文件夹tinyxml

2. 编译成静态库

2.1 进入目录tinyxml,用vim命令打开Makefile文件

2.2 将其中一行 OUTPUT := xmltest 修改为 OUTPUT := libtinyxml.a  表示编译出的静态库文件名字为 libtinyxml.a

2.3 将其中一行 SRCS :=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp 中的xmltest.cpp删掉 因为不需要编译该测试文件

2.4 将其中一行 ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 修改为 ${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 表示链接成静态库

2.5 将其中一行 xmltest.o:tinyxml.h tinystr.h 删除,因为不需要编译测试文件

2.6 保存Makefile文件

2.7 回退到上一层目录即目录tinyxml中,执行make命令,即可在该目录得到编译出来的静态库文件libtinyxml.a

3. 编译成动态库

3.1 进入目录tinyxml,用vim命令打开Makefile文件

3.2 在其中一行 DEBUG_CFLAGS     := -Wall -Wno-format -g -DDEBUG -fPIC 的末尾添加上 -fPIC 表示编译与位置无关的代码,PIC的意思即 Position Independent Code,

3.3 在其中一行RELEASE_CFLAGS   := -Wall -Wno-unknown-pragmas -Wno-format -O3 的末尾添加上 -fPIC 原因同上

3.4 将其中一行 OUTPUT := xmltest 修改为 OUTPUT := libtinyxml.so  表示编译出的动态库文件名字为 libtinyxml.so

3.5 将其中一行SRCS :=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp 中的xmltest.cpp删掉 因为不需要编译该测试文件

3.6 将其中一行${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 修改为${LD} -shared -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 表示链接成动态库

3.7 将其中一行xmltest.o:tinyxml.h tinystr.h 删除,因为不需要编译测试文件

3.8 保存Makefile文件

3.9 回退到上一层目录即目录tinyxml中,执行make命令,即可在该目录得到编译出来的动态库文件libtinyxml.so

六.Linux下的使用

1.   代码与步骤四中windows下的代码完全相同,需编写makefile,示例代码中有

2.   linux下示例代码下载地址:(内有介绍文档,请按照文档步骤操作,保证可以运行成功)

使用静态库的示例代码:http://download.csdn.net/download/yzf279533105/9942600

使用动态库的示例代码:http://download.csdn.net/download/yzf279533105/9942605

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值