Web Analytics

关于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

由bool类型引发的一个问题

C99 原生支持布尔类型,类型名字为_Bool。对C程序员来说,这个名字有些“不伦不类”,还好一般C标准库 实现的头文件中都用宏bool来替代_Bool。C99虽说是C语言当前的最新标准,但是它也有10年历史之久了。据说C1x标准 正在讨论制定中,有兴趣的朋友可以到标准C工作组 官方站点上去瞧瞧。 ...

October 21, 2010 · 4 min · Tony Bai

你好,TeX

由于某种原因,上周末开始学习使用TeX进行文档排版。哦,当然不是直接使用Donald Knuth他老人家设计的最原始的TeX命令。经过这么多年的发展,TeX领域早已出现了各种各样基于TeX开发的层次更高、易用性更好、更加让作者关注内容的好工具。在Ubuntu下,我选择了"TeX Live"。 ...

October 18, 2010 · 5 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

这个十一累并快乐着

自从LP上班后,果果一直由岳母照顾。带小孩子是一件很辛苦的差事,这个我和LP也十分清楚,这不这个十一假期我们让岳母回家歇息歇息^_^,这七天就由我和LP照顾果果。 平时我和LP都是朝九晚五的作息,由于公司离家较远,我们下班到家基本上都是晚上六点以后了。我回家更晚,有时候到家时果果已经被哄睡着了。这样我们和果果在一起的时间实际上并不多,甚至对果果新近养成的一些习惯了解得都不多,一切还要慢慢适应。 ...

October 6, 2010 · 3 min · Tony Bai

遭遇“死循环”

昨天看了“外刊IT评论”上的一篇名为《软件编程21法则》的文章,文章中提到的一条法则是:“软件直到被变成产品运行至少6个月后,它最严重的问题才会被发现”,当时表示认同。不过仅仅相隔一天,这条法则就变成了眼前的现实。 今天上午我们的某版本系统在某省出现了故障,该版本在这个省上线恰好将近6个月^_^,系统上线以来一直运行良好,直到这次故障。故障现象为"挂死":所有进程都挂死在某一把锁的lock上。以前出现这种情况多为某个进程加锁后,在锁内异常退出,未能释放锁而导致其他进程挂死。这种"挂死"多是代码中访问非法内存地址导致的,一般都会有core文件dump出来。不过这次出现挂死后,我们并未找到core文件的影子。查看系统运行日志也无果。通过脚本将所有该应用的子进程的运行栈快照收集到一个文件中,然后对这个数据庞大的文件进行分析,以试图找到一些蛛丝马迹。 ...

October 1, 2010 · 2 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

果果的百岁照

“百岁照是一种民间传统,一种在小孩100天时候拍的照片,代表了人们对孩子的祈福,希望孩子能长命百岁。” — 百度百科 在果果103天的时候我和LP一起带着果果去拍了一套百岁照。拍摄的过程很“艰苦”^_^:从上午9点一直持续到下午3点,其间果果睡了三次,哭了若干次,不过结果还是不错的,这不今天我和LP把照片取了回来。和我们那一代相比,现在的小孩子幸福多了。在我LP的钱包里放着我的一张儿时的照片,那是我大概五个多月时照的,似乎也是我的第一张正式照片了,起码我目前为止能找到的最早的照片就是它了(小时候身体比较虚弱,百天的时候老妈也没抱着我去照相^_^)。照片是黑白的,布景很简陋,只有一张铺着桌布的桌子,我穿着一个小背心儿,趴在桌子上,抬起小脑瓜,然后摄影师给我记录下了那一瞬间! 现在的百岁照都是按套系的,和婚纱照一样,什么版权数量、服装套数、各种册子和我叫不上来名字的物件都需要和影楼一一敲定。不过这些我一概不懂,都是LP前期和影楼谈好的,我只是出钱出力^_^。 ...

September 23, 2010 · 2 min · Tony Bai

做好个人代码备份与版本管理

今天下午花了一个小时分别和两位同事做了一些代码讨论,这两位同事正在编写的代码都具有一定的试验性质(暂不能进入项目代码库)。这里不谈代码如何如何,而是就我发现的一个问题谈谈我的看法。 ...

September 19, 2010 · 2 min · Tony Bai