标签归档:linux

Linux下将Tinyxml编译为静态库

       一个应用需要在Linux服务器上运行,不能保证每个服务器都有应用依赖的库,又懒得每个服务器都去安装下,也不太现实,于是就将应用所用到的库全部编译为静态库,直接丢到服务器上跑吧。此为应用调用xml配置文件依赖tinyxml库示例,记录下,备忘。

      1.下载tinyxml库,直接从官方下载,http://sourceforge.net/projects/tinyxml/。

      2.解压缩下载好的包,我解压缩到test目录下,进入项目目录。

      3.使用vim编辑器修改Makefile文件:

  •  将其中的OUTPUT := xmltest一行修改为:OUTPUT := libtinyxml.a
  • 将xmltest.cpp从SRCS:=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp中删除,,注释掉xmltest.o:tinyxml.h tinystr.h。因为不需要将演示程序添加到动态库中。
  • 将${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}修改为:${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}。
  • 保存退出。

      4.执行make命令编译,即可在当前目录生成libtinyxml.a文件。

      5.调用测试,当前目录新建一个test.cpp文件,内容如下:

#include "tinyxml.h"  
#include "tinystr.h"    
#include <iostream>    
using namespace std;  
   
int main()  
{  
	//创建一个XML的文档对象。  
	TiXmlDocument *myDocument = new TiXmlDocument("test.xml");  
	myDocument->LoadFile();  
      
	//获得根元素,即Persons。  
	TiXmlElement *RootElement = myDocument->RootElement();  
   
	//输出根元素名称,即输出Persons。  
	cout << RootElement->Value() << endl;  
        
	//获得第一个Person节点。  
	TiXmlElement *FirstPerson = RootElement->FirstChildElement();  
	//输出接点名Person  
    
	cout << FirstPerson->Value() << endl;  
	//获得第一个Person的name节点和age节点和ID属性。  
	TiXmlElement *NameElement = FirstPerson->FirstChildElement();  
	TiXmlElement *AgeElement = NameElement->NextSiblingElement();  
	TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();  
       
	//输出第一个Person的name内容,即周星星;age内容,即20;ID属性,即1。  
	cout << NameElement->FirstChild()->Value() << endl;  
	cout << AgeElement->FirstChild()->Value() << endl;  
	cout << IDAttribute->Value() << endl;  
   
        return 0;  
}  

创建test.xml文件,内容如下:

<Persons>  
	<Person ID="1">  
		<name>周星星</name>  
		<age>20</age>  
	</Person>  
	<Person ID="2">  
		<name>白晶晶</name>  
		<age>18</age>  
	</Person>  
</Persons>  

编译当前文件,调用libtinyxml.a库:

[root@server tinyxml]# g++ -o test test.cpp ./libtinyxml.a

执行编译好的程序:

[root@server tinyxml]# ./test
Persons
Person
周星星
20
1

将编译好的test和test.xml放至另外一台没有tinyxml的库,执行成功。

以上代码在centos5.4上测试正常。

sendmail的can not chdir(/var/spool/clientmqueue/)错误问题解决

服务器用的RedHat AS4版本,今天启用Sendmail功能的时候,出错:

Starting sendmail: [  OK  ]
Starting sm-client: can not chdir(/var/spool/clientmqueue/): Permission denied
Program mode requires special privileges, e.g., root or TrustedUser.

Google了一把,终于找到问题所在:

原来是/var/spool/clientmqueue/的权限配置不正确,sendmail没有权限访问这个目录,

默认的:

drwxrwx—  2 root root 4096 12月  9 19:27 /var/spool/clientmqueue

修改后:

drwxrwx—  2 smmsp smmsp 4096 12月  9 19:27 /var/spool/clientmqueue

重启sendmail服务,OK。