版权声明:本文为博主原创文章,未经博主允许不得转载。
静态库编译:
1.先从官网将tinyxml库下载下来。连接:http://sourceforge.net/projects/tinyxml/
2.执行解压命令:tar -xzvf xxxxx.tar.gz
3.成功之后进入tinyxml目录:cd tinyxml
4.使用vim或者其他的编辑器打开Makefile文件:vim Makefile
5.将OUTPUT := xmltest 改为OUTPUT := libtinyxml.a
6.xmltest.cpp删除,因为它只是一个测试源文件,不需要编译。
7.将${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}修改为:${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}
8.将Makefile的倒数第二行 xmltest.o:tinyxml.h tinystr.h,注释掉,因为不需要将演示程序添加到静态库中。然后保存退出
9.执行make命令编译,即可在Makefile所在目录下生成libtinyxml.a文件。
10.然后可以使用这个静态库了:$ g++ -o xmltest xmltest.cpp libtinyxml.a 注意:将使用的静态库放在源文件后面即可,如果静态库文件不在当前目录,应该使用它的绝对路径或者用g++的参数-L来指定路径,因为编译器默认在当前目录下先查找指定的库文件。
动态编译:
改变上面两个步骤,即可将静态编译变成动态编译
1.将步骤(5)OUTPUT := xmltest一行修改为:OUTPUT := libtinyxml.so
2.将步骤(7)${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}修改为:在"${LD}"后面加一个参数:-shared用于生成动态库。
为什么经过上述对Makefile文件的更改会生成静态库和动态库呐?
接下来我们来了解一下:
1.库文件是如何生成的:
静态库:先将源文件编译成目标文件:gcc -c test.c test1.c
生成静态库:ar -rc libstatic.a test.o test1.o
共享库:
先将源文件编译成目标文件:gcc -c test.c test1.c
生成共享库:gcc -fPIC -shared -o libshared.so test.o test1.o //f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)一般用在编译动态库的时候,ar命令可以用来建立或修改备存文件,或是从备存文件中抽取文件。
再看Makefile文件从文件分析可以看出OUTPUT为最终的目标,因此修改OUTPUT变量的值可以改变最终生成的文件的名字,改为libtinyxml.a则生成的文件名就为libtinyxml.a。而OUTPUT的生成则依赖于OBJS变量,和下面的命令:${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS},由LD := g++可以看出,LD变量为g++命令,因此在${LD}后加上一个-shared选项,就可以生成动态库文件。由AR := ar rc可以看出,AR变量为ar命令,因此把${LD}改为${AR},并且把-o选项删除,就可以生成静态库文件。
【注】要把Tinyxml移植到嵌入式开发平台下,只需要把CXX := g++改为CXX :=arm-linux-g++,即把编译器改为交叉编译器。
接下来写个测试程序,看是否配置成功
在tinyxml目录创建一个测试的xml文件,文件名为test.xml,内容如下: