存档

2011年7月 的存档

将程序所需的第三方库静态编译进可执行文件中

2011年7月11日 没有评论

这两天由于项目的需要,需要将一个第三方库libxml2编译进可执行文件中,最终能够在没有安装libxml2的linux机器上运行所编写的程序。

我编写的程序是一个日志记录模块,有三个很简单的文件,log.c,log.h,main.c。log.c负责实现日志记录的相应接口,main.c则调用log.c编译生成的库文件使用这个接口来记录日志。

首先查阅网上资料以后,知道了gcc的-static选项可以完成这一功能,同时需要注意的是使用-static选项时需要将-lxml2选项放在gcc命令的最后。

所以正常情况下,如下的命令即可完成我的需求。(lxml2依赖于pthread,z,m库)

gcc -c log.c -I/usr/include/libxml2 -L/usr/lib -lxml2
 
ar -r liblog.a log.o
 
gcc -static main.c -o main -I/usr/include/libxml2 -L. -llog -L/usr/lib -lxml2 -lpthread -lz -lm

但是非常不幸的是,这样子编译出来的可执行文件运行后会出现段错误。但是如果不加上static选项进行编译,那么编译出来的二进制文件可以运行。

然后郁闷了半个小时,在网上搜了很多的资料,皇天不负有心人,终于被我找到原因了。

由于我是使用的虚拟机下面的Ubuntu8.04进行相关的开发工作的,所以在安装libxml2的开发包时就直接用了apt-get install。但是,非常悲剧的是,该版本下的libxml2存在一个与线程相关的bug。

该bug的描述如下,from Jerome

i just found out an issue with libxml2 and static linking. It is occuring on ubuntu 8.04.

  1. take a libxml2 example from the official website at http://xmlsoft.org/examples/tree2.c
  2. you compile it and link it in static gcc -g -static -Wl,–start-group `xml2-config –cflags –libs –static` tree2.c -Wl,–end-group -o tree2
  3. and then ./tree2 and you get core dump

oopsa not happy jerome not happy

LATER: before i was using ubuntu feisty 7.04 and all was fine. so i looked at launchpad and took 2.6.27.dfsg-1ubuntu3version. recompiled it myself under hardy and linked it statically. no more crash. oopsa. and i filled a bug for it

解决方案如上所述,但是查看了bug列表后,我又找到了一个更简单的解决方案

The answer is simple, don’t link threaded programs statically, there are

many reasons why it is a wrong thing to do.

If you really must do so, the safest solution is
-Wl,–whole-archive -lpthread -Wl,–no-while-archive

所以最后,我的最后一个编译命令变为了

 gcc -static main.c -o main -I/usr/include/libxml2 -L. -llog -L/usr/lib -lxml2 -Wl,--whole-archive-lpthread -Wl,--no-whole-archive -lz -lm

 

分类: C 标签: , , ,

I’m back

2011年7月11日 1 条评论

Hi, all dears, I’m back to myhome.
In the last two years, I didn’t often update my blogs. Sorry for your expect!
I’ve learned a lot in software development and research in this period.
Now I’ve completed my first year of postgraduate life. I think it’s time to summarize what I have learned before. And good news is in my second year I have plenty of time!
Finally, Best wishes with you all!

分类: 未分类 标签: