linux下tinyxml开发入门

从http://ncu.dl.sourceforge.net/sourceforge/tinyxml/tinyxml_2_4_0.tar.gz下载tinyxml,可以根据自己的需要,选择不同的版本。

将tinyxml_2_4_0.tar.gz上传到主机,然后解压执行如下命令:

 tar -xzvf tinyxml_2_4_0.tar.gz

成功之后,会在当前目录出现一个tinyxml目录,进入该目录cd tinyxml,然后进行编译,顺序执行如下命令:

cd tinyxml

make

在屏幕上会打印如下输出:

[dev@localhost tinyxml]$ make g++ -c -Wall -Wno-format -g -DDEBUG tinyxml.cpp -o tinyxml.o g++ -c -Wall -Wno-format -g -DDEBUG tinyxmlparser.cpp -o tinyxmlparser.o g++ -c -Wall -Wno-format -g -DDEBUG xmltest.cpp -o xmltest.o g++ -c -Wall -Wno-format -g -DDEBUG tinyxmlerror.cpp -o tinyxmlerror.o g++ -c -Wall -Wno-format -g -DDEBUG tinystr.cpp -o tinystr.o tinystr.cpp:38: warning: aggregate has a partly bracketed initializer g++ -o xmltest -g tinyxml.o tinyxmlparser.o xmltest.o tinyxmlerror.o tinystr.o

没有出现错误,表示编译完成,这时可以执行tinyxml自带的测试程序xmltest。

我直行xmltest之后,打印出一堆乱码,后来就没有管。自己写程序测试了。

 

为了使用tinyxml开发,使用方便,做了一些配置。

添加环境变量TINYXML_ROOT,编辑.bash_profile,添加如下内容:

############################################# #### for tinyxml ############################################# export TINYXML_ROOT=$HOME/tinyxml

把tinyxml包编译打包成一个连接库,方便开发,这就要修改tinyxml目录下的Makefile。

 #**************************************************************************** # # Makefile for TinyXml test. # Lee Thomason # www.grinninglizard.com # # This is a GNU make (gmake) makefile #**************************************************************************** # DEBUG can be set to YES to include debugging info, or NO otherwise DEBUG := YES # PROFILE can be set to YES to include profiling info, or NO otherwise PROFILE := NO # TINYXML_USE_STL can be used to turn on STL support. NO, then STL # will not be used. YES will include the STL files. TINYXML_USE_STL := NO #**************************************************************************** CC := gcc CXX := g++ LD := g++ AR := ar rc RANLIB := ranlib DEBUG_CFLAGS := -Wall -Wno-format -g -DDEBUG RELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O3 LIBS := DEBUG_CXXFLAGS := ${DEBUG_CFLAGS} RELEASE_CXXFLAGS := ${RELEASE_CFLAGS} DEBUG_LDFLAGS := -g RELEASE_LDFLAGS := ifeq (YES, ${DEBUG}) CFLAGS := ${DEBUG_CFLAGS} CXXFLAGS := ${DEBUG_CXXFLAGS} LDFLAGS := ${DEBUG_LDFLAGS} else CFLAGS := ${RELEASE_CFLAGS} CXXFLAGS := ${RELEASE_CXXFLAGS} LDFLAGS := ${RELEASE_LDFLAGS} endif ifeq (YES, ${PROFILE}) CFLAGS := ${CFLAGS} -pg -O3 CXXFLAGS := ${CXXFLAGS} -pg -O3 LDFLAGS := ${LDFLAGS} -pg endif #**************************************************************************** # Preprocessor directives #**************************************************************************** ifeq (YES, ${TINYXML_USE_STL}) DEFS := -DTIXML_USE_STL else DEFS := endif #**************************************************************************** # Include paths #**************************************************************************** #INCS := -I/usr/include/g++-2 -I/usr/local/include INCS := #**************************************************************************** # Makefile code common to all platforms #**************************************************************************** CFLAGS := ${CFLAGS} ${DEFS} CXXFLAGS := ${CXXFLAGS} ${DEFS} #**************************************************************************** # Targets of the build #**************************************************************************** OUTPUT := xmltest LIB := libtinyxml.so all: ${OUTPUT} ${LIB} #**************************************************************************** # Source files #**************************************************************************** SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp # Add on the sources for libraries SRCS := ${SRCS} OBJS := $(addsuffix .o,$(basename ${SRCS})) LIBOBJS := tinyxml.o tinyxmlparser.o tinyxmlerror.o tinystr.o #**************************************************************************** # Output #**************************************************************************** ${OUTPUT}: ${OBJS} ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} ${LIB}: ${LIBOBJS} ar -r $@ ${LIBOBJS} #**************************************************************************** # common rules #**************************************************************************** # Rules for compiling source files to object files %.o : %.cpp ${CXX} -c ${CXXFLAGS} ${INCS} $< -o $@ %.o : %.c ${CC} -c ${CFLAGS} ${INCS} $< -o $@ dist: bash makedistlinux clean: -rm -f core ${OBJS} ${OUTPUT} ${LIB} ${TEST} depend: #makedepend ${INCS} ${SRCS} tinyxml.o: tinyxml.h tinystr.h tinyxmlparser.o: tinyxml.h tinystr.h xmltest.o: tinyxml.h tinystr.h tinyxmlerror.o: tinyxml.h tinystr.h

在tinyxml目录下重新执行make,会看到多执行了一行命令:

ar -r libtinyxml.so tinyxml.o tinyxmlparser.o tinyxmlerror.o tinystr.o

生成了一个包libtinyxml.so,有了这个包,使用tinyxml开发的时候,在连接命令中加入这个包的连接,就可以正确地生成目标程序。

 

现在来写一个小程序测试一下,在tinyxml目录创建一个测试的xml文件,文件名为test.xml,内容如下:

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

在tinyxml下创建,也添加了一个测试程序tinyxml_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; }

在tinyxml目录下修改Makefile,修改之后的内容如下:

#**************************************************************************** # # Makefile for TinyXml test. # Lee Thomason # www.grinninglizard.com # # This is a GNU make (gmake) makefile #**************************************************************************** # DEBUG can be set to YES to include debugging info, or NO otherwise DEBUG := YES # PROFILE can be set to YES to include profiling info, or NO otherwise PROFILE := NO # TINYXML_USE_STL can be used to turn on STL support. NO, then STL # will not be used. YES will include the STL files. TINYXML_USE_STL := NO #**************************************************************************** CC := gcc CXX := g++ LD := g++ AR := ar rc RANLIB := ranlib DEBUG_CFLAGS := -Wall -Wno-format -g -DDEBUG RELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O3 LIBS := DEBUG_CXXFLAGS := ${DEBUG_CFLAGS} RELEASE_CXXFLAGS := ${RELEASE_CFLAGS} DEBUG_LDFLAGS := -g RELEASE_LDFLAGS := ifeq (YES, ${DEBUG}) CFLAGS := ${DEBUG_CFLAGS} CXXFLAGS := ${DEBUG_CXXFLAGS} LDFLAGS := ${DEBUG_LDFLAGS} else CFLAGS := ${RELEASE_CFLAGS} CXXFLAGS := ${RELEASE_CXXFLAGS} LDFLAGS := ${RELEASE_LDFLAGS} endif ifeq (YES, ${PROFILE}) CFLAGS := ${CFLAGS} -pg -O3 CXXFLAGS := ${CXXFLAGS} -pg -O3 LDFLAGS := ${LDFLAGS} -pg endif #**************************************************************************** # Preprocessor directives #**************************************************************************** ifeq (YES, ${TINYXML_USE_STL}) DEFS := -DTIXML_USE_STL else DEFS := endif #**************************************************************************** # Include paths #**************************************************************************** #INCS := -I/usr/include/g++-2 -I/usr/local/include INCS := #**************************************************************************** # Makefile code common to all platforms #**************************************************************************** CFLAGS := ${CFLAGS} ${DEFS} CXXFLAGS := ${CXXFLAGS} ${DEFS} #**************************************************************************** # Targets of the build #**************************************************************************** OUTPUT := xmltest LIB := libtinyxml.so TEST:= tinyxml_test all: ${OUTPUT} ${LIB} ${TEST} #**************************************************************************** # Source files #**************************************************************************** SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp # Add on the sources for libraries SRCS := ${SRCS} OBJS := $(addsuffix .o,$(basename ${SRCS})) LIBOBJS := tinyxml.o tinyxmlparser.o tinyxmlerror.o tinystr.o #**************************************************************************** # Output #**************************************************************************** ${OUTPUT}: ${OBJS} ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} ${LIB}: ${LIBOBJS} ar -r $@ ${LIBOBJS} ${TEST}: tinyxml_test.o ${LD} -o $@ ${LDFLAGS} tinyxml_test.o -L${TINYXML_ROOT} -ltinyxml #**************************************************************************** # common rules #**************************************************************************** # Rules for compiling source files to object files %.o : %.cpp ${CXX} -c ${CXXFLAGS} ${INCS} $< -o $@ %.o : %.c ${CC} -c ${CFLAGS} ${INCS} $< -o $@ dist: bash makedistlinux clean: -rm -f core ${OBJS} ${OUTPUT} ${LIB} ${TEST} depend: #makedepend ${INCS} ${SRCS} tinyxml.o: tinyxml.h tinystr.h tinyxmlparser.o: tinyxml.h tinystr.h xmltest.o: tinyxml.h tinystr.h tinyxmlerror.o: tinyxml.h tinystr.h

 

然后执行make,这时,可以看到多了一个tinyxml_test 生成,执行tinyxml_test,得到如下输出结果:

Persons Person 周星星 20 1

你可能感兴趣的:(linux,include,makefile,profiling,output,preprocessor)