Web Analytics

使用Libtool创建库文件

除了autoconf和automake,GNU的autotools工具包中还有一种工具,它就是libtool。顾名思义,libtool是一个关于库文件制作、安装和使用的工具,它屏蔽了各个平台在库制作、安装和使用方面的差异,为上层提供了统一的接口。你可以直接使用libtool创建静态或共享库,也可以将libtool与autoconf、automake结合在一起使用。第二种方式显然更具实际意义,也更为简单。 在一个使用autoconf和automake构建的编译环境中添加libtool的支持,只需改动几处即可: 首先,你需要在configure.in(或configure.ac)中添加AC_PROG_LIBTOOL宏(注意:去掉AC_PROC_RANLIB宏)。 其次,修改Makefile.am: 如果是建立库文件,则需将lib_LIBRARIES改为lib_LTLIBRARIES,同时将库的后缀名由.a改为.la,这将告诉automake采用libtool来创建相关库: lib_LIBRARIES = libfoo.a => lib_LTLIBRARIES = libfoo.la libfoo_a_SOURCES = libfoo.c => libfoo_la_sources = libfoo.c ...

December 14, 2010 · 3 min · Tony Bai

也谈共享库

近两天一直在考量产品安装包改进的事宜。说实话,我们的安装包做得不够"专业",不仅没有按照各个平台的标准安装包形式(比如redhat的rpm,debian的deb或solaris上的pkg包)制作,而且安装包在生产环境中还需要再进行一次链接才能得到最终的可执行程序。这样一来,每次制作安装包都很费时费力(虽然有自动打包脚本),安装包的"体积"也很是庞大,因为包中要包含所有.o目标文件和一部分自有库以及第三方库的.a文件。 ...

December 13, 2010 · 7 min · Tony Bai

lcut增加对mock的支持

记得恰好是在一个月前的今天,我发布了lcut(轻量级C语言单元测试框架)0.1.0版本 。由于发布仓促,文档没能及时跟上。在stackoverflow的一个关于单元测试的帖子 上,一位叫Craig McQueen的朋友也给出了建议:“Some documentation would be helpful. Project background and goals, a features list, advantages over existing alternatives, etc would be helpful for people who are checking it out for the first time.” 看完这个建议后心里那个汗啊!不过一想到用E文编写文档心里就有些打怵。就这样在这一个月里文档依旧没有改观:(。不过,lcut本身还是有一些进步的,这两天一直规划着为lcut增加mock的支持,今天终于将这个功能加进了lcut,并发布了lcut-0.2.0-beta版,欢迎大家试用,并提出意见和建议。 ...

October 29, 2010 · 3 min · Tony Bai

关于Makefile.am中与Build相关的变量设置

今天尝试使用autoconf和automake重新构建一个遗留库的Build环境。之前改造的lcut的目录结构还是相对简单,改造时并未遇到什么难题,不过今天就没那么幸运了,我在头文件目录包含设置这个看似简单的环节上遇到了一些小麻烦。 这个库结构其实也没那么复杂,只是源文件和头文件不在一个目录下罢了: testproj/ – Makefile.am – configure.in – include/ – xx.h – yy.h – module1 – xx.c – Makefile.am – moudle2 – yy.c – Makefile.am 开始也没多想,参照以前的经验一步一步生成configure脚本。执行configure脚本生成Makefile文件,敲入make。在进入module1目录后,提示编译xx.c文件失败,无法找到xx.h!看了一下gcc的编译选项,的确没有-I上层的include目录,只有"-I.“和”-I.."。翻看了一下automake的manual,发现automake默认情况下是将config.h所在的目录当作-I的参数。我的configure.in中是这样设置的:AC_CONFIG_HEADERS([config.h]),怪不得无法正确设置目录呢!将该句改为AC_CONFIG_HEADERS([include/config.h])后,重新生成Makefile并执行make,这回gcc命令行上出现了"-I../include"的字样,编译也很是顺利。 ...

October 26, 2010 · 3 min · Tony Bai

从mock malloc说起

上午对一段代码进行单元测试,由于需要用到mock,所以选择使用cmockery 作为Unit Testing框架(lcut还未提供mock功能)。测试代码里需要mock malloc以模拟分配内存失败的异常情况。 编写一个用例后,Build,提示出错:multiple definition of `malloc’。经检查发现Makefile中定义mock malloc的那个目标文件(.o文件)居然被link了两次,类似于下面的这种错误情形: $ gcc testmain.c malloc.o malloc.o malloc.o: In function `malloc’: malloc.c:(.text+0×0): multiple definition of `malloc’ malloc.o:malloc.c:(.text+0×0): first defined here collect2: ld returned 1 exit status ...

October 11, 2010 · 8 min · Tony Bai

发布一款轻量级C语言单元测试框架

基于各种xUnit框架的单元测试早已不是什么新鲜玩意儿,不过在"古老"的C语言领域,还尚未有哪种框架可以成为“寡头”。 记得2005年末的时候,初出茅庐的我吸取xUnit的设计思想在业余时间编写了一个轻量级的C单元测试框架lcut(Lightweight C Unit Test framework),当时还写了一篇文章《C单元测试包设计与实现》记录了最初的设计和实现思路。本打算将这个小工具在部门内至少是项目内推广,可无奈当时部门内部尚未认识到使用框架工具进行单元测试的好处,或者尚未形成此种技术风气,当时的我也是“人轻言微”,因此这个小工具也没能吸引足够的眼球。这么长时间以来,都是我自己一直在使用, 其间,lcut做了两次小规模修改。特别是最后一次修改,通过增加测试用例执行的返回状态(增加LCUT_TEST_RESULT()宏),让lcut可以与一些持续集成工具(如cruisecontrol.rb)结合在一起使用。 ...

September 30, 2010 · 3 min · Tony Bai

Hello,autoconf和automake

部门绝大多数的产品都运行在Sun的小型机上,底层的操作系统是Solaris。这两年公司开始主推刀片机(物美价廉^_^),不过刀片机上运行的也是Solaris 10 for x86版本。基于同种OS的前提下在Sparc和x86两种体系之间做移植比较简单,主要考虑字节序问题就可以了。不过对于可移植性的考虑不足还是让我们付出了较大的工作量。 在即将进行的新版本产品开发中,可移植性依旧没有被列入到必须要考虑实现的特性列表中,不过从未来产品演化和发展的角度考虑,现在就应该未雨绸缪,在可移植性方面多下工夫! ...

September 26, 2010 · 9 min · Tony Bai

也谈Configure脚本问题的解决

开了一个下午的技术交流会,回到办公室时离下班时间已经不远,天气预报说今晚有暴雪,外面阴沉的天气似乎也证实了这一点。这时一个同事遇到了一个软件包编译的问题,一时无法解决,向我求助。 ...

March 19, 2010 · 3 min · Tony Bai

简说GLIBC strncpy实现

比较以下两组代码,你认为哪组运行的更快些呢? Example1: int n = 100; int n4 = n » 2; int i = 0; int a[100]; for (i = 0; i < n4 ;i += 4) { a[i] = i; a[i+1] = i+1; a[i+2] = i+2; a[i+3] = i+3; } ...

April 15, 2009 · 2 min · Tony Bai

GLIBC strlen源代码分析

直接操作C标准库提供的字符串操作函数是有一定风险的,稍有不慎就会导致内存问题。这周用业余时间写了一个小型的安全字符串操作库,但是测试之后才发现自己的实现有很大的性能缺陷。 在Solaris上初步做了一个简单的性能比对,以下是得到的性能数据(以strlen的数据为例): 当传入的字符串长度为10时,执行100w次: strlen 执行时间是:32762毫秒 my_strlen执行时间是:491836毫秒 ...

April 11, 2009 · 5 min · Tony Bai