关于作者

用户名:liuqi80
笔名:Light
地区: 北京-海淀区
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:55
评论个数:16
留言条数:0




Powered by BlogDriver 2.1

未来花园

 

God said, "Let there be light," and there was light.^_^ 心有多宽,人生的舞台就有多大! E-mail:liuqi80@yahoo.com.cn

文章

庆祝一下找到bug!
折腾了一周,终于把自己负责解决的defect的相关代码找到,发帖庆祝一下。嘻嘻,今天下午把它修改了。

- 作者: Light 2007年02月2日, 星期五 12:20  回复(0) |  引用(0) 加入博采

猪,你生日快乐

昨天是俺生日,呵呵。27岁了,不过俺依然年轻。

昨晚加班至8点,然后回学校去找LP。LP给买了一个蛋糕,很漂亮的蛋糕,感动ing,嘻嘻;之前LP还送了一本设计模式相关的书,呵呵,知道俺喜欢什么。去了一个经常吃饭的地方,两人点了几个菜,小吃了一顿。十点以后回住的地方,路上LP给唱起了“猪,你生日快乐”歌,呵呵。

本来昨天想写一下呢,回去太累了,没再上网,今天补上。

- 作者: Light 2007年01月31日, 星期三 11:37  回复(0) |  引用(0) 加入博采

任正非最新讲话:18年华为没有1项原创发明
华为公司作为一家高科技企业,从创业开始,就始终坚持市场的商业成功为导向,一切投资、一切管理的改进都紧紧围绕产品的市场商业成功,尤其摒弃的是脱离商业成功导向的、唯技术的创新。这种盲目自傲的创新,对于我们没有资金来源的公司来说,无异自杀。


  华为公司作为一家高科技企业,从创业开始,就始终坚持市场的商业成功为导向,一切投资、一切管理的改进都紧紧围绕产品的市场商业成功,尤其摒弃的是脱离商业成功导向的、唯技术的创新。这种盲目自傲的创新,对于我们没有资金来源的公司来说,无异自杀。

  华为在过去的18年里每年坚持投入销售收入的10%以上在研发上,尤其是最近几年,有超过二万五千名员工从事研发工作,资金投入都维持在每年70、80亿元以上,经过十八年的艰苦奋斗,至今为止,华为没有一项原创性的产品发明,主要做的、所取得的是在西方公司的成果上进行了一些功能、特性上的改进和集成能力的提升,更多的是表现在工程设计、工程实现方面的技术进步,与国外竞争对手几十年、甚至上百年的积累相比还存在很大差距;对于我们所缺少的核心技术,华为只是通过购买的方式和支付专利许可费的方式,实现了产品的国际市场的市场准入,并在竞争的市场上逐步求得生存,这比自己绕开这些专利采取其他方法实现,成本要低得多,由于我们的支付费用,也实现了与西方公司的和平相处。

  2004年华为公司推向市场的一款WCDMA的分布式基站,相比传统的基站,运营商每年的运行/运维费用包括场地租金、电费等可以节约30%,为客户带来了价值的同时体现了产品的竞争力,从而获得了客户的好评和选择。这款分布式基站没有革命性的技术,也不存在过多的技术含金量,仅仅是工程工艺上的改进而已。

  事实上,在产品的工程实现技术方面,我们也经常遇到瓶颈,包括算法、散热技术、工艺技术、能源、节能等在内都时常成为我们在竞争中获得优势的障碍。为了解决这些问题,克服发展障碍,我们也不全靠自主开发,因为等自主开发出来了,市场机会早没有了,或对手已在市场上构筑了优势,我们没法在竞争的市场上获利,所以,我们经常采用直接购买技术的方式来缩短差距并构筑领先。

  我们有一款全球领先而且份额占据第一的产品,在功能、性能上超越竞争对手的一个关键技术,是我们通过购买某外国公司的技术而获得的。我们寻找并选择了一家超长光传送技术和产品解决方案研究上非常领先的厂家,该公司累计投入已经超过$70M,其技术主要应用在骨干长途光传送系统中,网络地位非常重要,经分析认为其产品和技术具有很高的市场价值,最后决定购买该技术。经过技术转移和二次开发,以及必要的法律手续,在短短的9个月时间内完成了集成开发,成功推出应用了新关键技术的产品,实现了大容量、长距离(4600公里)无电中继的光传输。03年推出该解决方案以来,在相关市场上得到快速发展,从最初的全球名不见经传的长途传输厂家,到2005年就已经快速成长为全球在长途传输市场第一的厂家,并保持稳固的地位,特别值得一提的是:依靠优异的性价比,我们在拉美最大的固定运营商Telemar的653光纤系统上,依靠比其他厂家更强的带宽传送能力实现了市场突破性应用。

  华为公司清醒地认识到,我们在技术上需要韬光养晦,必须承认国际厂商领先了许多,这种巨大的差距是历史形成的,一方面,由于发达国家创新机制的支持,普及了创新的社会化,技术获取相对容易;另一方面,当我们还在创始时期起步阶段,国外有些专利就已经形成了,无论是系统实现原理的还是技术实现细节的,国际领先厂商已经领先很多了。市场本身是开放的,但是我们要真正在全球市场上能够占有一席之地,使我们的产品和系统能够进入国际市场,我们只有通过谈判,支付合理的许可费用,才能够使得市场对我们也是开放的,也只能这样,才能扩展我们的市场空间,扩展我们的生存空间,这对我们是有利的,至少可以利用我们的相关优势拉动巨大的制造业前进。

  华为公司历来尊重别人的知识成果和知识产权,同时也注意保护自己的知识产权。华为真诚地与众多西方公司按照国际惯例达成有关知识产权谈判和交叉许可,我们在多个领域多个产品与相应的厂商通过支付许可费的方式达成了交叉许可协议。宽带产品DSLAM,是阿尔卡特发明的,我们经过两年的专利交叉许可谈判,已经与其他公司达成了许可,我们会支付一定的费用,换来的是消除了在全球进行销售的障碍,经过努力,我们的DSLAM市场份额达到了全球第二。国际市场是一个法治的环境,也是一个充满官司的环境,华为有了这些宝贵的经验,今后就不会慌张失措了。华为以后依然要在海外取得规模收入,如果没有与西方公司达成许可协议和由此营造的和平发展环境,这个计划就不能实现。我们付出专利许可费,但我们也因此获得更大的产值和更快的成长。

  今天,由于技术标准的开放与透明,未来再难有一家公司,一个国家持有绝对优势的基础专利,这种关键专利的分散化,为交叉许可专利奠定了基础,相互授权使用对方的专利将更加普遍化。由于互联网的发达,使创造发明更加广泛化了、更容易了。我们充分意识到需要在知识产权方面融入国际市场“俱乐部”,知识产权是国际市场的入门券,没有它高科技产品就难以进入到国际市场。

  虽然华为每年按销售收入的10%以上投入研究开发,在研究经费的数量级上缩小了与西方公司的差距,也在IPR上缩小差距,目前华为已有一万多项专利申请,但相对世界几十年的积累仍是微不足道的。IPR投入是一项战略性投入,它不像产品开发那样可以较快的、在一、两年时间内就看到其效果,这需要一个长期的、持续不断的积累过程。

  我们也充分地认识到了基本专利的成长过程是十分漫长而艰难的,基础专利的形成是要经历很长的时间,要耐得寂寞,甘于平淡,急躁反而会误事。基本专利的形成是冰冻三尺,非一日之寒。即使是应用型基本专利的成长过程也至少需要3~5年。我们一直倡导并建立了相应机制,鼓励板凳要坐十年冷,同时坚定地走出去积极融入国际性行业组织中,广泛地与业界同道交流、合作、协调;特别是在行业论坛以及行业标准开发组织中积极参与,共同致力于行业的成长和发展。虽然我们在国内外总共申请了超过1万件专利,但我们知道真正的核心的基本专利还不多,我们还会持之以恒地而且仍然在功能、特性、工程实现技术等方面加强投入,继续反对盲目创新、反对小农意识、反对自我封闭、反对闭门造车,坚持合作与自研并重,在把握行业发展趋势的同时顺应业界的潮流、顺应相应的规则下,厚积薄发、投放有序、广泛合作、优势互补,共同推进行业的发展和进步、构建良好的商业发展环境。

  二、华为的发展情况

  华为公司成立于1988年,在党和政府的关怀下,经过十八年的艰苦努力,由当初十几人发展成为现在六万多名员工的公司。十八年来,华为累计缴纳关税、增值税、企业所得税、个人所得税等各项税收253亿人民币。

  华为公司长期聚焦通信领域的设备研发、制造和为客户提供解决方案,经过多年的奋斗,今天可以提供电信领域的较完善的端到端解决方案,产品覆盖移动通信、数据通信、光网络、固定通信、电信应用业务与软件、终端等领域。

  华为在北京、深圳、上海、南京、西安、成都、武汉等地设立了研发机构,并建立了国际化的全球同步研发体系,在印度的班加罗尔、美国的达拉斯、美国的圣地亚哥、瑞典的斯德哥尔摩、俄罗斯的莫斯科等建立了研究所。华为公司重视研发质量管理,全面实施CMM5(国际上软件开发管理的最高等级)和集成产品开发流程(IPD)等管理流程和方法,从事软件研发的机构基本上都通过了CMM5级国际认证。

  中国是世界上最大的新兴市场,因此,世界巨头都云集中国,公司创立之初,就在自己家门口碰到了全球最激烈的竞争,我们不得不在市场的狭缝中求生存;当我们走出国门拓展国际市场时,放眼一望,所能看得到的良田沃土,早已被西方公司抢占一空,只有在那些偏远、动乱、自然环境恶劣的地区,他们动作稍慢,投入稍小,我们才有一线机会。为了抓住这最后的机会,1996年开始,众多华为员工离别故土,远离亲情,奔赴海外,无论是在疾病肆虐的非洲,还是在硝烟未散的伊拉克,或者海啸灾后的印尼,以及地震后的阿尔及利亚……,到处都可以看到华为人奋斗的身影。我们有员工在高原缺氧地带开局,爬雪山,越丛林,徒步行走了 8天,为服务客户无怨无悔;有员工在国外遭歹徒袭击头上缝了三十多针,康复后又投入工作;有员工在宿舍睡觉,半夜歹徒破门而入拿枪顶着我们的员工进行抢劫;我们在拉美某地的班车也遭遇持枪歹徒抢劫,全车人被抢;即使是货物运送,也经常需要雇佣特殊人员护卫;有员工在飞机失事中幸存,惊魂未定又救助他人,赢得当地政府和人民的尊敬;也有员工在恐怖爆炸中受伤,或几度患疟疾,康复后继续坚守岗位;在一些国家,我们有70%的中国籍员工得过疟疾;我们还有三名年轻的非洲籍优秀员工在出差途中飞机失事不幸罹难,永远地离开了我们……。

  在资金缺乏、竞争激烈的独联体市场,华为人忍辱负重、默默耕耘了10年,从获得第一单38美金的合同起,集腋成裘,到2005年销售额6亿美元,成为公司重要的市场。在要求严格的欧洲市场,经历三年的认证,我们终于通过了英国电信的考试,成为英国电信重要合作伙伴;为获得中东某电信运营商的认可,面对世界级电信设备商的竞争,我们冒着室外60度的高温进行现场作业,长达数月,靠着全心全意为客户服务的诚意,经过2年多的坚持不懈,终于开通了我司全球第一个3G商用局……

  经过十年来的不懈奋斗和挣扎,华为逐渐地在海外取得了一些收获,2005年海外的收入超过了国内,尽管也进入了部分发达运营商的市场,但是我们在超过一半的市场空间里基本上是没有突破,尤其在北美、西欧和日本。

  我们所处的行业方向选择太多而且还处在巨大变化之中,我们一直存在生存危机也一直生存在危机中,华为的衰退和倒闭一定会到来,而只有时时警醒我们自己,我们才能进步,才能延迟或避免衰退和倒闭的到来。

  三、面对我们所处的产品过剩时代,华为人除了艰苦奋斗还是艰苦奋斗。从来就没有什么救世主,也不靠神仙皇帝,要创造我们的幸福,全靠我们自己。

  中国高科技企业的成长之路注定充满坎坷与荆棘。选择了这条道路的人生注定艰辛与劳碌,同时也更有价值。

  在中国,在高技术领域做一个国际化的企业、开拓全球市场,我们没有任何经验可以借鉴,完全靠摸索,在市场中摸爬滚打,在残酷的竞争中学习;

  在中国,做一个以几万年轻知识分子为主的企业,竞争又是全球范围和世界级水平,我们没有任何成功的实践可以借鉴;

  在中国,做一个企业,竞争对手是全球各发达国家的世界级巨子,他们有几十年甚至一百多年的积累,有欧美数百年以来发展形成的工业基础和产业环境,有世界发达国家的商业底蕴和雄厚的人力资源、社会基础,有世界一流的专业技术人才和研发体系,有雄厚的资金和全球著名的品牌,有深厚的市场地位和客户基础,有世界级的管理体系和运营经验,有覆盖全球客户的庞大的营销和服务网络。面对这样的竞争格局,面对如此的技术及市场壁垒,我们没有任何经验可以借鉴。

  十八年来,我们公司高层管理团队夜以继日的工作,许多高级干部几乎没有什么节假日,所有的主管24小时不能关手机,随时随地都在处理随时发生的问题。现在,更因为全球化后的时差问题,总是连轴转地处理事务和开会。我们没有国际大公司积累了几十年的市场地位、人脉和品牌,没有什么可以依赖,我们只有比别人更多一点奋斗,只有在别人喝咖啡和休闲、健身的时间都在忘我努力地工作,否则,我们根本无法追赶上竞争对手的步伐,根本无法缩小与他们的差距。

  经历90年代初艰难的日子,在资金技术各方面都匮乏的条件下,我们咬牙把鸡蛋放在一个篮子里,紧紧依靠集体奋斗,群策群力,日夜攻关,利用压强原则,重点投入重点突破,我们终于研制出了我们的第一台通讯设备——数字程控交换机。

  公司创业之初,我们没有资金,是创业者们把自己的工资、奖金投入到公司,每个人只能拿到很微薄的报酬,发工资经常打白条,绝大部分干部、员工长年租住在农民房,用有限的资金购买原材料、购买实验测试用的示波器,正是老一代华为人“先生产,后生活”的奉献,才挺过了公司最困难的岁月,支撑了公司的生存、发展,才有了今天的华为。一直到2001年,我们才拿出了所获得的利润的一部分来改善我们的员工的生活,让我们的部分员工解除了基本的生活上的后顾之忧。

  由于我们年轻,无法避免地在解决方案的理解上不准确,无法避免地在设计、实现上存在幼稚和缺陷。1998年,交换机用户板因为设计不合理,导致对全网一百多万块用户板进行整改;2000年,光网络设备因为电源问题,为了对客户负责和诚信,我们从网上回收、替换了20多万块板子,这些板子在仓库里堆积如山,造成损失十几亿;西欧某运营商,由于我们对于客户的需求理解偏差大,造成无法及时交付,只能按合同赔偿;亚太的一个移动运营商,选择我们的彩铃系统,由于工期极其紧张,导致工程质量低,造成诸如鸳鸯线等低级错误,给客户造成很大影响;VPN系统由于没有考虑逃生设计,局部故障导致系统中断,客户无法使用业务;系统操作、管理权限不是基于使用者而是基于角色设计的,由于权限过大,误操作导致整个系统瘫痪等等,无不是因为我们的年轻和幼稚,因为这种年轻和幼稚,所以我们必须也只能付出更多代价,系统的设计和研发要推倒重来,过去的工作等于是白做了。为了还能够赶得上市场的节奏,为了还能够从市场上获得竞争先机,我们只能付出比别人更多的精力来工作,加班累了,就在办公室铺下垫子睡一觉,醒了就继续干;思路没了,就在办公室铺下垫子睡一觉,有了思路就继续干,所以也造就了华为公司传承至今的垫子文化。

  2001年开始的网络泡沫,市场急剧下滑和萎缩,尤其是2002年,华为深深地感受到了严冬的寒冷和彻骨。那一年,我们公司的销售是负增长,公司很多员工因为暂时的不利处境,纷纷离开公司,更加使华为公司雪上加霜的是,不少离开公司的员工离开的时候带走了华为公司的源程序、设计原理图等核心商业机密信息,在外面或自己开公司或有偿泄漏给同业者进行仿制,这种零成本、无投入的仿制,在市场上还全面形成了对华为的正面竞争,几乎造成华为公司的灭顶之灾。

  由于对市场形势和发展判断失误,我们错失了很多可以获得收益和利润的市场机会;由于没有准确判断泡沫带来的低谷,对局部市场和产品盲目乐观,造成了5亿元的器件库存和积压;NGN至今亏损超过10亿、3G至今亏损超过40亿,不知道什么时候才能收回投资。

  住两块钱的招待所,顿顿吃方便面,睡机房,我们经常经历;跟我们在同一个客户那里出差的竞争对手的工程师,住的是当地最高档的宾馆,我们是多么地羡慕;在同一个机房干活的竞争对手的工程师,一到下午下班时间就收拾东西走了,而我们还在吭哧吭哧地干,我们还是羡慕。

  我们通过集体降薪来支撑住公司;我们通过忘我工作来弥补我们年轻造成的过错;我们通过舍家别妻奔赴海外开疆拓土来为公司过冬添棉袄。公司上下同心同德卧薪尝胆,我们挺到了今天。

  自公司创立那一天起,我们历经千辛万苦,一点一点地争取到订单和农村市场;另一方面我们把收入都拿出来投入到研究开发上。当时我们与世界电信巨头爱立信、阿尔卡特等的规模相差200倍之多。通过一点一滴锲而不舍的艰苦努力,我们用了十余年时间,终于在2005年,销售收入首次突破了50亿美元,但与通信巨头的差距仍有好几倍。最近不到一年时间里,业界几次大兼并,一下子使已经缩小的差距又陡然拉大了。我们刚指望获得一些喘息,直一直腰板,拍打拍打身上的泥土,没想到又要开始更加漫长的艰苦跋涉……

  05年春节晚会上,《千手观音》给了我们很大震撼。那些完全听不到声音,也许一生都不知道什么是声音的孩子,在没有任何音乐协调的情况下,形成那么整齐划一的动作,那么精美绝伦的演出,其中的艰辛和付出可想而知。华为数万名员工,正同他们一样,历经千辛万苦,才取得今天一点进步。但我们始终认为华为还没有成功,华为离成功还很远,华为的国际市场刚刚有了起色,所面临的外部环境比以往更严峻。海外很多市场刚爬上滩途,随时会被赶回海里;产业和市场风云变幻,刚刚积累的一些技术和经验又一次面临自我否定。在这关键时刻,我们不能分心,不能动摇甚至背弃自己的根本,无论现在、还是将来,我们除了艰苦奋斗还是艰苦奋斗。

- 作者: Light 2007年01月3日, 星期三 16:00  回复(0) |  引用(0) 加入博采

辞旧岁,迎新年

马上就要2006年告别了,不知道该为这繁忙的一年说些什么。一年以来差点在繁忙中迷失了自己,用繁忙的工作和学习来忘掉烦恼。几年的付出成就了现在的我:沉默、执着、自信。

毕业答辩完以后在重新思考着自己的人生之路,坎坎坷坷,似乎不再想追求什么,但心中却泯灭不了自己的梦想。按照自己的规划一步步走下去,已经为前面的坎坷做好了充足的准备。

辞别旧岁迎新春,希望新的一年自己有新的起点。

浪奔浪流
万里涛涛江水永不休
淘尽了世间事
混作滔滔一片潮流

是喜是愁
浪里分不清欢笑悲忧
成功失败
浪里看不出有未有

爱你恨你问君知否
似大江一发不收
转千弯转千滩
亦未平复此中争斗

又有喜又有愁
就算分不清欢笑悲忧
仍愿翻百千浪
在我心中起伏够

- 作者: Light 2006年12月31日, 星期日 14:44  回复(0) |  引用(0) 加入博采

毕业答辩准备中

明早就毕业答辩了,准备中!

突然感觉周围的很多人很浮躁,有时自己也是这样的。呵呵。

- 作者: Light 2006年12月18日, 星期一 12:40  回复(0) |  引用(0) 加入博采

要毕业了

最近几天在忙着准备毕业答辩!改论文,写答辩胶片,准备答辩材料,偶尔顾及一下工作。

互芯周一给offer了,但待遇比较低,6k,做的东西还不错,准备放弃了。

鼎新周三给offer了,待遇在对应届生还可以,7k×13,但感觉很不稳定,外包公司。

这周面了raisecom,跟嵌入式软件部的老大聊了近一个小时,感觉找到了知音,呵呵。下周三去面HR,如果解决户口,差不多就签了。

这二去Fortinet去笔试和面试,钱要的太高,给逼视了。于是总结了一下经验:出来混的,要相互逼视!呵呵:)

soft tech公司的面试顺利通过,在等待去Intel那边去二面,去Intel那边做多核处理器的应用开发。

- 作者: Light 2006年12月15日, 星期五 15:30  回复(2) |  引用(0) 加入博采

这几天的面试

开始找工作了,除了忙着面试,还要准备毕业答辩,还有一些笔试。

这周还算有些战果的,呵呵。

周二笔试raisecom,自己笔的不咋的,毖掉;下午去NEC电子面试,至今没有二面的消息;华为笔试、面试,一切顺利。

周三去上午去面凤凰微电子,感觉公司不大,但比较有潜力,跟两个经理聊了一个小时,要等消息;下午去华为三面,毖掉,因为俺是应届生,嘿嘿。

周四上午去鼎新面试,一切顺利;下午投了互芯集成电路公司,一小时后回复电话周五早上面试。

周五上午去笔试面试互芯,一切顺利,感觉公司还不错,做的是自己比较喜欢的东西;下午得到11号去谈薪资的通知。

总体感觉还不错,做的基本都是自己比较喜欢的方向。要学的东西还比较多,需要再学习点新东西啊。

- 作者: Light 2006年12月9日, 星期六 17:43  回复(1) |  引用(0) 加入博采

想起一个人

这两天很奇怪,总是想起以前的一个人,一个曾经很甘心为她付出的人。

好奇怪啊!!!!!!!!!!!!!!!!!

- 作者: Light 2006年12月6日, 星期三 20:19  回复(0) |  引用(0) 加入博采

有点点疲惫

这两天在忙着面试,真的很好累。

昨天华为路由产品联系去笔试和面试,很顺利,不过今天最后一面的卡住了,因为他们是社会招聘,俺还没有毕业。呵呵,这种事情发生两次了,以后再联系我要直接拒掉了。

昨天面NEC电子,感觉他们不咋的;今天面凤凰微电子,也没什么感觉;反正技术上不会有什么问题,主要是薪水和户口问题了。户口制度好恶心呢,faint的无语了。

今晚又接到两个电话去安排面试,还是嵌入式方面的,准备去看一下了;还有自己要主动投一下简历了。

加油!!

- 作者: Light 2006年12月6日, 星期三 20:02  回复(0) |  引用(0) 加入博采

Makefile编写指导(二)

三、make是如何工作的

在默认的方式下,也就是我们只输入make命令。那么,

    1make会在当前目录下找名字叫“Makefile”“makefile”的文件。
    2
、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
    3
、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
    4
、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
    5
、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o的文件也是最新的啦,于是file.o的文件修改时间要比edit要新,所以edit也会被重新链接了(详见edit目标文件后定义的命令)。

而如果我们改变了“command.h”,那么,kdb.ocommand.ofiles.o都会被重编译,并且,edit会被重链接。
四、makefile中使用变量

在上面的例子中,先让我们看看edit的规则:

      edit : main.o kbd.o command.o display.o \
                  insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o \
                       insert.o search.o files.o utils.o

我们可以看到[.o]文件的字符串被重复了两次,如果我们的工程需要加入一个新的[.o]文件,那么我们需要在两个地方加(应该是三个地方,还有一个地方在clean中)。当然,我们的makefile并不复杂,所以在两个地方加也不累,但如果makefile变得复杂,那么我们就有可能会忘掉一个需要加入的地方,而导致编译失败。所以,为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。

比如,我们声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管什么啦,只要能够表示obj文件就行了。我们在makefile一开始就这样定义:

     objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

于是,我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了,于是我们的改良版makefile就变成下面这个样子:

    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit $(objects)


于是如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。

关于变量更多的话题,我会在后续给你一一道来。


五、让make自动推导

GNUmake很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。

只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。


    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)

    main.o : defs.h
    kbd.o : defs.h command.h
    command.o : defs.h command.h
    display.o : defs.h buffer.h
    insert.o : defs.h buffer.h
    search.o : defs.h buffer.h
    files.o : defs.h buffer.h command.h
    utils.o : defs.h

    .PHONY : clean
    clean :
            rm edit $(objects)

这种方法,也就是make隐晦规则。上面文件内容中,“.PHONY”表示,clean是个伪目标文件。

关于更为详细的隐晦规则伪目标文件,我会在后续给你一一道来。


六、另类风格的makefile

即然我们的make可以自动推导命令,那么我看到那堆[.o][.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易,谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的makefile吧。

    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)

    $(objects) : defs.h
    kbd.o command.o files.o : command.h
    display.o insert.o search.o files.o : buffer.h

    .PHONY : clean
    clean :
            rm edit $(objects)

这种风格,让我们的makefile变得很简单,但我们的文件依赖关系就显得有点凌乱了。鱼和熊掌不可兼得。还看你的喜好了。我是不喜欢这种风格的,一是文件的依赖关系看不清楚,二是如果文件一多,要加入几个新的.o文件,那就理不清楚了。


七、清空目标文件的规则

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个修养(呵呵,还记得我的《编程修养》吗)。一般的风格都是:

        clean:
            rm edit $(objects)

更为稳健的做法是:

        .PHONY : clean
        clean :
                -rm edit $(objects)

前面说过,.PHONY意思表示clean是一个伪目标,。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后
上面就是一个makefile的概貌,也是makefile的基础,下面还有很多makefile的相关细节,准备好了吗?准备好了就来。

- 作者: Light 2006年12月4日, 星期一 12:57  回复(0) |  引用(0) 加入博采

Makefile编写指导(一)

在网上搜到的一篇文章,写的是相当的不错,免去自己看英文的MAKE说明书,转载一下!

作者:陈皓  版权归原作者所有,呵呵:)

1、概述

什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些WindowsIDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:DelphimakeVisual C++nmakeLinuxGNUmake。可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在文件依赖性上做文章,这里,我仅对GNUmake进行讲述,我的环境是RedHat Linux 8.0make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCCCC