wenjiang 的个人资料morning's blog照片日志列表更多 ![]() | 帮助 |
|
|
11月20日 腾讯开始全面打击QQ外挂刚才在完美论坛看到如果使用QQ时用完美助手,会导致需要输入验证码;
这一招曾经就猜测过,没想到TX真的这么做了.不做评论了,安心用QQ2009就是了.
另外,有一些人的皮肤上出现不要使用非法外挂的提示,不知道是统一提示还是检测到用户正在使用外挂.
做QQ辅助软件的,做打包QQ的,都得小心了.莫趟浑水.
正在用fineplus的朋友,感谢大家一直以来的支持,尤其是fineplus修改版的偏执狂们,为了QQ帐号安全,放弃FP吧.
Jerry Yang,我们和Yahoo都会记得你这是一封离职信。在杨致远执掌雅虎一年后,已经发生和悬而未决的一切事情都似乎愈发复杂。与微软之间喧嚣漫长的收购战,与股东之间波谲云诡的争斗,给杨致远的前程和雅虎的未来蒙上了一层厚厚的迷雾。在杨致远身上曾经被寄予的厚望和如今普遍的置疑,很像那句著名的台词“我猜到了开头,却没猜到结尾。”
最新:刘韧等人涉嫌敲诈勒索罪正式被批捕新闻来源:《京华时报》 昨天,认定其行为已涉嫌敲诈勒索罪,西城检察院批准警方逮捕北京千橡集团副总裁刘韧及其两名手下。警方材料初步证实,此前,刘韧及其两名手下曾编写负面文章诋毁“奇虎360安全卫士”杀毒软件,而后又以删除文章为名,向该软件所属公司索取23万元。 今年7月中旬,管理着Donews、猫扑网站的北京千橡集团副总裁刘韧,先后找到负责管理Donews、猫扑网编辑工作的徐新事,软件评测网站17tech(由刘韧所控制)软件编辑游央两人。此后,他安排两人在上述3个网站(Donews、猫扑网、17tech)上,大量发布并转载不利于“奇虎360安全卫士”杀毒软件的评论文章,以及针对该软件开发公司(北京三际无限科技公司)老总个人的一些负面消息。 [转]已确认:魅族M8开始量产J.Wong今天凌晨终于在魅族论坛上宣告了M8手机量产的消息,这款研发拉锯战以年来计算的国产跳票王终于要准备发力占领市场了.
11月19日 改 革 PK 文 革(转)在准备迎接改革开放三十年之际,又一场造神开始,“改革不可动摇”喊声四起,有人摇旗要为改革开放树碑立传,有人要让“普世价值”成为圣经,三格格恭请教宗本笃十六世来国超度,连奥运火炬也搭便车成为“圣火”,可一查百度词典,显示:未找到和您的关键词 “圣火” 相匹配的词典解释。 至于文革,经常与“十年浩劫”、“灾难深重”、“经济崩溃”等联系在一起。文革成了某些人最忌讳的字眼,他们有着切肤之痛,利用一切机会、一切手段妖魔化文革。经常有人说,文革是当今社会一切恶的源头,什么不好的东西似乎都是文革造成的。批评一下改革中的问题,就是“文革余孽”反对改革;反思一下资产阶级自由化的问题,就是文革思维打压学术自由;批判一些现实的丑恶现象,就是为文革极左翻案;怀念一下毛泽东,就是借怀念毛泽东为文革招魂……反正文革是个筐,什么不好的东西都可以往里装,只要有人实事求是地说几句,立马就会有人跳出来说:看,现在还有人为文革辩护,这不是“文革余孽”是什么? 历史是一面镜子,一个国家、一个政党要敢于正视自己的历史,善于总结,才能进步。 “文革”PK“改革” 1、经济发展 经济发展是改革开放政策最得意之作,可以说是大力发展了生产力,但改革走的是一条“吃老本,挖墙角,留缺口,重消费,卖将来,坑后代”之路;三十年过去了,周总理的“四个现代化”没影了;翻了一番又一番,老百姓解放前的三座大山却变成了五座;改革开放实行的是典型的肚皮经济学,买办阶层、腐败铁三角等确实先富了起来,而给老百姓的是小恩小惠,“五有”还是未来的胡萝卜。 毛泽东时代走的是一条“重工业,重技术,重积累,省自已”之路,是“前人栽树,后人乘凉”之路。文革期间, 在中苏边界抵御战争和国际封锁及东南沿海反美蒋入侵险恶环境下,经济快速增长,且增长实在、质量确保、没有泡沫。全国修建水库、江堤、河道堤坝,新增3亿亩灌溉面积。纵观六、七十年代我国的农业发展,不仅没有什么“发展缓慢”之说,而且更无什么“濒临崩溃”现象,相反,是成功地完成了一次升级改造的任务,是农业向水利化、机械化迈进过程中最具有决定性的阶段。期间还建成了成昆铁路、河南8000多公里的红旗渠等。 2、国际影响 在毛泽东的正确决策下,中国积极倡导和平共处五项原则,开展睦邻友好的和平外交。文革前,我国被排挤在联合国之外,与我国建交的国家三十几个,文革猛增至一百一十多个国家,亚非拉朋友遍天下,我国是第三世界国家的利益代言人和捍卫者。第三世界国家把中国“用轿子抬进”了联合国,驱逐了台湾代表,恢复了在联合国的合法席位,成功突破了国际封锁,并揭开了中美关系正常化的序幕。毛泽东提出的“两个中间地带”理论和“三个世界划分”理论,在国际上产生了广泛影响。维护世界和平、反对霸权主义、中国属于第三世界、中国永远不称霸确立为中国外交的重要原则。 改革开放以来,外交方略是“韬光养晦”,巴结西方,严重伤害了传统友好国家的感情和利益。自己大使馆被炸,军机在本国领空被撞毁,国家尊严尽失还要去人家家里献媚卖笑。 3、社会建设 文革十年几乎无贪、无赌、无杀掳掠绑,夜不闭户,路不拾遗,成为至今人们仍然回忆称颂的“太平盛世”。刑事犯罪案件少,1966~1978年间,我国的犯罪率为2.4%, 没有假文凭假学历假证照、假警察假军人、假成果和伪劣商品,没有黄赌毒,消除了拐卖妇女儿童;公务人员普遍地廉洁奉公,被国际组织评为最廉洁国家。 改革开放以来,社会犯罪愈来愈甚,平均发案率为9.7%;坑蒙拐骗偷抢赌杀等,家家户户每年都会遭遇无数次;吸毒人员上千万,艾滋病累计已达 100多万人;雇佣、奴役、伤害的血泪事件几乎天天发生,不胜枚举;家庭解体、犯罪剧增,宗教冲突、种族矛盾、民族纠纷日益激化,恐怖主义、分裂主义、暴力主义日升,深度伤害、摧残了几亿人。 4、科学技术 文革期间,两弹一星、核潜艇为中国赢得了尊严和安全;新四大发明----杂交水稻(75年袁隆平杂交水稻科研成果的推广)、汉字激光照排、人工合成牛胰岛素、复方蒿甲醚,西方发达国家也没能搞出来;大型喷气客机、铁路机车、现代海船、微电子、卫星回收、计算机、高性能航空发动机,大规模集成计算机研制成功、蚕式导弹世界闻名;建成下水的高科技“远望号”系列测量船等,其技术高度至今难以逾越,70年下水的导弹驱逐舰,其制海能力在世界上首屈一指。当时的中国在工业农业、军事国防等领域,创造了无数第一,是世界第六工业大国、第三军事大国、第十八科技强国。 改革开放是在科学的春天里叫响的,一边高喊“科学技术是第一生产力”,一边下令大批科学研究下马。彻底完成了科学使命----消灭了科学! 改革开放三十年,想为你歌唱,可----小曲好唱口难开! “文革”与“改革”,孰优孰劣一目了然!如果是一个真正为国家为人民着想的党,如果是一个真正奋发进取的国家,对待自己走过的历史,不应该人为地史为我用,采取不负责任的态度简单地感情定性;不应该人为地歪曲、篡改、贬低或故意地粉饰、美化、拔高,而应该科学地敢于面对事实认真地总结教训,敢于扬长避短。只有这样,这个国家这个民族才会有希望有前途! 任何的神圣化改革、妖魔化文革,绝不是科学发展观! 毛泽东必将成为年轻一代心目中最神圣的偶像,这必将是历史发展的最终结果.作为数亿七十年代以后出生的中国人,他们崇拜毛泽东,多半是受书本、媒体、上辈人耳濡目染所至——这就是历史的传承。人,以有限的生命无法经历太多的事物,不能说没有亲身经历的事都可以不管不顾。为了个体成长,为了服务社会,学习、借鉴、倾听是永远需要的。所以青年也崇拜毛泽东并不出格,正好折射这一代人尊重历史的品格与难以磨灭的英雄情结。是一笔宝贵的人文资产和精神财富。 现在在到中国最普通人数最多占据国土最广的人群中去调查,结果会如何?我想,只要不是弱智或别有用心,答案只有一个:毛泽东依然是人们最崇拜的偶像,民族英雄之第一人! 提到“崇拜”,一些“专家”“精英”们免不了又来一通“高谈阔论”——什么“庸俗”啊,“愚蠢”啊,“无知”啊……其实我要说:对别的什么类人崇拜可能有诸如因素,唯独对毛泽东的崇拜没有!——因为人们崇拜毛泽东的是他的人格、思想,而不是他的权力、财富或一技之长。可以说,崇拜毛泽东的人一般没有功利色彩,多的是平民情节,激荡的是正义之心!有的人一味反对对别人的“崇拜”,却恨不得大伙都来崇拜他,自己做秀不说,还恩威并用拉人抬轿吹喇叭,结果大都“新开茅厕三天香”…… 毛泽东离开我们近三十多年了,为何民间乃至世界的“毛泽东热”不降反升? ——有的文章说:他不是神,他比神还神。神能领导人民推翻三座大山吗?神能赶走侵略者和打倒蒋匪帮吗?神能领导人民建立社会主义吗?1949年后,中国是一个康复后急需要进补和防疫以避免再病倒的人。这是要在不确定中寻找确定,在“无”中建立“有”,还要确保这个“有”,要永远存在下去,并发挥作用。毛泽东后一个体系(建设体系),就是要解决这个问题,实际上他取得了成功,只是这个成功被政治偏见抹杀了,被一些人否定了。为什么这样?就是毛泽东在实施第二体系的时候,把那些短视的家伙或打倒了,或让他们靠边站了,这些人后来复辟了,就发泄私愤,对毛泽东无情报复。这是一个对无法反抗者的死者的恶毒的报复。它是不道德的,也是对历史的彻底的反动。历史正在还给毛泽东清白。这个清白,西方严肃的学者已经还给了毛泽东。中国的民间许多真正有头脑的人,也还给了毛泽东。就以经济为例,有人得到的概念是,毛泽东不懂经济,不搞经济建设,把经济搞到临崩溃的边缘。实际上,1949年到1976年,中国GDP 年平均递增10%以上,这个增长内涵实在,质量确保,没有泡沫,是在有西方封锁和禁运条件下,自力更生取得的。而今天,我们靠了高额的内外借贷,巨大的西方资金和技术,天文数字的资源消耗,才取得了不到10%的年平均递增。 ——有的文章说:这个世界上替强者效劳的思想理论不计其数,教诲弱者屈从强者的说教浩如烟海,唯独毛泽东思想专门替受强者欺凌的无辜弱者说话;专门教导弱者如何由弱变强;教导遭受强国侵略的弱国不靠寄人篱下,不靠卑躬屈膝,不靠主权交易,完全依靠自力更生、艰苦奋斗来改变命运。对于外来援助,毛泽东从来是白给欢迎,花钱买可以,拿主权换绝对不干。无论是美国还是苏联都拿毛泽东毫无办法,打不赢,吓不倒,骗不过,困不住,“硬刀子”“软刀子”全部失灵毛泽东是有史以来唯一一个让资本主义的西方白人尝到失败滋味而自己始终不败的中国人; ——有的文章说:以前的生活为什么比较贫穷?新中国建立以后,我们在短短三年内恢复了国民经济,同时还打赢了朝鲜战争(有人说是打平了,但是如果把中国和美国的装备倒一下?美国人早就被赶下大海了),清除了危害几千年的匪患和污泥浊水,大规模地扫除了文盲和迷信,社会的清明是自古未有的,真正是万众归心。没有失业,连国民党残留的几百万党政人员都养下来了,历史上有哪个政权那么宽容?一直潦倒的文人再也不会为生活发愁了。要知道,解放前全国80% 以上的人处于赤贫和饥饿状态,上海一夜大雪,第二天上午街头收尸300具。所以,应该说吃饭穿衣问题50年代就基本解决了(温饱标准不同)。这也是外国人感到惊讶的地方; ——有的文章说:由于国家的工业化需要高积累,我国当时的积累率一直在30%以上,最高达到39%,严重地挤压了人民生活(苏联之所以在短时间内完成工业化也是由于高积累)。比如我国1953年就装备了3000架作战飞机,1956年开始自造飞机,1958年就装备5000架“歼6”(属于当时世界上最先进的飞机)。工业化没有高积累是不可能实现的,而高积累,就必然会影响人民生活的提高,这样就表现出粮食、副食品、生活用品、轻工产品的匮乏和生活改善的缓慢,而人民是不能够直接感受到高积累的好处的。在那个时代,是不讲究个人回报的,只讲为祖国多做贡献,只讲集体主义——这为后来的改革开放奠定了雄厚的物质基础与思想基础(——人们在自身利益遭到不公正的“牺牲”时表现出世界各国罕见的宽容与忍耐),XXX曾经指出:我们能在今天的国际环境中着手进行四个现代化建设,不能不铭记毛泽东同志的功绩。从某种意义上说我们现时吃“祖宗饭”一点不为过! ——有的文章说:现在贫富差距拉大,收入分配不公。富的住高级别墅,开豪华轿车,吃山珍海味,洗桑拿按摩,唱歌跳舞,尽情潇洒。穷的买不起房,看不起病,子女上不起学,甚至吃饭都成问题。尤其是一部分暴富人群的收入来源大都不正。毛泽东时代立足长远,富国强兵,人民生活虽然苦些,但干部以身作则,在公平的分配原则下,住房由单位和国家解决,人人有份。单位职工看病实报实销,不存在看不起病的问题。中小学的学费很少,大学中专以上的学生学费由国家承担,每月有生活费。贫富差距不大且收入就业有保障,绝无大学毕业即失业、拖欠克扣工资等怪事;现在贪官越来越多,官衔越来越高,腐败花样不断翻新。回头看看毛泽东时代,虽然运动多,开会多,批判多,但贪污腐败现象确实很少,抓出了刘青山,张子善就能震撼全国;现在道德不进反退,风气日益败坏。毛泽东时代学雷锋做好事蔚然成风,拾金不昧助人为乐的现象比比皆是,人与人之间的关系也比较和谐。反观今日,惟利是图,见死不救,欺骗造假,敲诈勒索的现象遍地皆有。人与人之间的关系也逐渐变成了马克思说过的赤裸裸的金钱关系; ——有的文章说:在一个较长的时间里,有那么多的“精英”分子们,都在叫嚣说毛泽东时代国家没有法律?然而事实恰恰相反,正是在毛泽东时代,我们的祖国才没有黑社会,没有黄赌毒泛滥,没有贪官污吏们巧取豪夺国家和民众的财富;毛泽东时代我们国家在共产党领导下,制定和发布了包括《宪法》《民法》《刑法》《刑事诉讼法》……等在内的大量的国家法律、法规、条例、条令以及规章制度,有很多法律现在仍在使用,或者经过修改后还在使用;在“没有法”的年代,夜不闭户,路不拾遗,人们虽穷但心不累,社会那样地和谐,人与人那样地融洽,助人为乐平常事,见义勇为人人争;在“没有法”的年代,政府和人民心贴在一起,“为人民服务”是政府官员的唯一!田间,车间到处都有公仆的身影,同吃,同住,同劳动,社会主义的阳光,沐浴着每一个公民的心田! 在“没有法”的年代,“六亿神州尽舜尧”,国家的利益高于一切,“散沙”在党的旗帜下凝聚成磐石,在国旗下仰起了脸,挺起了胸,“我是中国人”; 毒和娼一夜间被禁,千年的恶习一扫光,行业只是社会分工的不同,职位只是工作的需要,三百六十行,行行出状元,把知识奉献给人民。把发明创造贡献给祖国,把自己投入到人类最美好的事业中去! 在“没有法”的年代,犯罪,违规所付出的成本,让一切心怀不轨的人必须面对,再三斟酌,祸及子孙的成本,让他们收敛了犯罪的欲望。加大惩罚力度,就是加大了预防犯罪的力度,加大惩罚力度,是消除犯罪的有效手段! 在“没有法”的时代,好人有好报,英雄人人都在学习,社会不仅把荣誉赋予了英雄,英雄的荣誉还惠及子孙亲朋,好事有人夸,坏事有人抓,良好的社会风气净化着每一个人的灵魂; 在“没有法”的时代,在没有“钱”的年月,我们盖起了学校,让所有人的孩子走进了教室,让优秀的孩子免费读完大学,我们在农村盖起了医院,“把医疗工作的重点放到农村去”!让农民有了最起码的医疗条件,我们努力减少“三大”差别,每一个公民都能享受到基本的生活保障;…… 现在是“有法”的日子,“法”却失去了威慑的力量。有的地方,黑社会在收“治安费”;有的地方,贼和警察联手,猫鼠一家‘’有的地方,官黑勾结,横行乡里;有的地方,执法者知法违法犯法,法律的天平失去了平衡,欺行霸市,连救人的药都有假的,社会风气令人窒息,难道现在就是法制社会? 现在是“有法”的日子,有“乌沙”的卖帽子,有“章子”的卖批文,有“特权”的卖掉良心吃回扣,国企的管理者卖了国企买国企,女大学生为学费卖“ 处”,良家女求生存出租“子宫”,(代怀孕)英雄流血还要流泪,天大地大没有“权”大,爹亲娘亲没有“钱”亲!难道在就是法制社会带来的文明?! 现在“有法”了,我们有“钱”了,却无力修缮破旧的教室,无力改善农村的医疗环境,“钱”把求学的孩子拦在校门外,“钱”拖住了前往医院看病病人的腿,“两极分化”创造了世界之最,人均医疗保障落到了世界倒数第四。野生动物不面临死亡,不会有野生动物保护法,人的生态环境不恶化,也不会有环境保护法;……假医假药、假冒伪劣产品随处可见,假烟、毒酒、毒奶粉坑害百姓,走私贩私长期猖獗,黄赌毒肆虐,黑社会团伙横行,黑矿主残害矿工生命,血吸虫大面积复发,艾滋病大面积人为感染,银行发生巨额坏帐和不良资产,以改革的名义大量窃取国有资产……这一桩桩,一件件,那一样是法制社会应有的行为? 不懂经济的经济学家,不懂经济与政治、文化、教育、国际贸易的关系的专家们却傻牛傻牛的。什么私有化,什么科斯定律,什么帕雷托最优,什么市场配置,什么产业化,什么什么什么,头头是道,搞的热火朝天,到头来出了问题方才说“事情的发展和我们预料的不一样”。 ——有的文章说:文革时期是新中国外交上最辉煌的时期,如获准进入联合国并担任常任理事国,与一百多个国家建交,世界三鼎足之一。文革时期的科技,依中科院世纪末统计,千年重大科技成就,文革十年最多,有氢弹、卫星、胰岛素、杂交水稻、哥德巴赫猜想等,神州号的主要关键技术也是那时的。军事上打败了美苏、南越,捍卫了国家主权和领土完整。当时社会安定,据中央政府统计数据显示,经济几乎年年高速增长。 ——有人爱把“文革”中出现的局部短期的“斗走资派”、“破坏文物”看作“文革”的全部,这如同把现实中“程维高迫害郭光允”、“盗窃走私国宝”、“贩卖妇女儿童”、“医院见死不救”、“买官卖官”等看作“改革”的全部一样; 有的文章说:毛泽东一家为中国革命献出了六位亲人的生命,三年困难时期带头勒紧裤带,不管对自己还是对子女亲朋从不搞特权——仅举一例:五十年代初,毛泽东给秘书田家英写的一封信中说:“有人求我将她(李淑一女士)荐到文史馆为馆员,文史馆资格颇严,我荐了几人,没有录取,未便再荐。”像李淑一这样“我失骄杨君失柳”类型的友人,在这件事情的处理上,他表现出的胸襟有哪位领导人堪与相类?!一位功高无人可比,权大无人能及的“大帝”,在个人问题上,却谨守原则,把自己当成普通的一员,这是何等难能可贵?!毛泽东为所有的人民公仆做出了榜样。人民永恒地怀念你,不仅是他的丰功伟绩,更有他的以身作则! ——有的文章说:党的领袖谁最伟大?——不比很难使人信服:要看他(她)对建党、建国的贡献,要看他(她)对党与人民的态度,要看他(她)的经典著作、理论是否经得起人民与历史的检验,要看他(她)的知识、智慧、远见、胆略是否在常人之上,要看他(她)的人格(包含对子女的教育)是否高尚,要看他(她)不仅仅在位时且在去世后人们的怀念程度..........这些,都不是少数御用文人或亲生子女或亲自出马拍电影、电视、造书所能达到目的的!得人心者得天下,得天下者不一定得人心——真正的伟人得天下只是一步,长久地得人心才是万世之功!以此而论——毛泽东之伟大,是无与伦比的!!! 前几年有留学生有到贵州调查,贵州的农民一谈起毛主席就是哭,就是流泪。西藏农牧民家里最显着的位置普遍挂着毛主席像。拍《长征》电视剧时,藏族同胞看见“毛主席的队伍”来了,无不热泪盈眶,拿出食物给摄制组的人吃,坚决不要钱。导演深有感触地说“不拍长征,不知道毛主席的伟大。” 见过毛泽东的人很少不承认他的伟大。着名的爱国华侨资本家陈嘉庚访问延安后叹道“我原来以为中国的救星尚未出世……其实,此人已经四、五十岁了,……此人现在延安,他就是毛主席。 老将军们绝大部分对毛泽东都是感恩的,毕竟是毛泽东让他们辉煌。彭总临终前的遗言是:毛主席发展了马克思列宁主义。陈毅元帅病重期间,几个月都靠输液维持生命,未曾吃进一粒米,但1971年的12月26日,他却要求吃面,看他吃的非常艰难,护理人员都劝他别吃了,他费力地说:今天是毛主席生日,我要为他吃长寿面啊!所有的护理人员都感动得流下热泪。罗瑞卿大将出狱的第一件事就是穿的整整齐齐,到天安门的毛主席像前,立正站好,然后敬了个标准的军礼。黄克诚大将说,我们这一代人对毛主席的感情是非常深厚的,是超出个人恩怨的。叶剑英80年代一听见别人提起毛主席的名字或者谈论毛主席,就激动得老泪纵横。杨成武上将更是声称:认识毛泽东是我一生最大的幸运。杨尚昆写道:“我从‘文化大革命’开始一直关到1975年,确确实实没有动摇过对毛主席的信念,……现在有些人觉得奇怪,说你们这些人受了这么严重的迫害,出来工作以后还讲毛主席好。 戚本禹是毛泽东亲自下令抓的,现在也还是为毛泽东说话。地方上的老干部就更不用说。这些不能用愚忠来解释。就象恩格斯评价马克思一样:“他有很多敌人,但是他未必有一个私敌。”否定毛泽东的反倒是为他们打抱不平的后人。 世界各国对毛的评价与中国截然不同。世界对毛的尊崇是我们不敢想的。1949年底毛泽东访问苏联,临走送行的时候,毛泽东住处的全部苏联工作人员都哭得出不了门,他们私下说:“觉得毛主席比斯大林更亲(见师哲回忆录)”。英国政治家一直到现在最佩服的人还是毛泽东。尼克松、基辛格、希思(英国前首相)、德斯坦(法国前总统)等人在90年代在接受电视采访时从来都是尊称毛主席,而我们国内官方称呼毛泽东同志。一些人则称呼“老毛”,把蒋介石却叫“蒋先生”。所以现在世界上对毛最不尊敬的是中国人自己。 瑞典有个政治家从1977年毛主席纪念堂落成以后,每年都要来中国瞻仰。80年代初期,面对反毛的现象,他焦急地说:“中国的年轻人要记住毛主席,没有毛主席,就没有中国”(此事人民日报登载)。汤姆路奇是美国魏斯里安大学教授,1991年毛主席逝世十五周年的时候,他到北京参观毛主席纪念堂。一走进纪念堂,他情不自禁地哭了起来。当时,中央电视台正在里面拍摄,摄相机的镜头自然而然地对准这位正在哭泣的外国人。路奇说:“毛主席是世界上最伟大的革命家。还有谁比他更伟大?没想到他才去世十五年,世界仿佛变了个样,社会主义运动乱成一团……现在才懂得,为什么毛主席的逝世是世界革命人民难以弥补的损失。一想起这些。从心底里感到难受。”世界各国的毛泽东纪念邮票,一直到现在还陆续发行,其中大部分是第三世界国家发行的。至于毛泽东研究的书籍就更多了。 其实,一个人与一件事一样:当权或流行时的“一时之誉”往往说明不了什么,只有经过一定的“时效”后的评审才会客观、公正,因摆脱了利益与危机,顾忌没了。 回首毛泽东,全国广大人民所以对他深情怀念,是经过了时间的洗礼,证明无论他的思想、功德、人格、才智、学识还是著作理论或对世界、中国、后人的影响,谁都无法与之相比! “神化”“个人崇拜”,其实是个“伪问题”,君不见:有的人,你怎么“树”他,还是“扶不起来的天子”,要不就是在位时“歌声”一片,去位后“讥声”不绝!逝去的领导人何其多,有谁能像毛泽东这样被国内国外如此广大、如此持久的“神化”“崇拜”呀?不带功利色彩的歌功、颂德,永远是劳动人民和有识之士本色! 美国把首都取名华盛顿,建立林肯纪念馆,不是个人崇拜的一种官方行为吗?毛泽东在努力抑制群众对自己的个人崇拜方面,是古今中外所有的其它政治家都不敢这么做的。哪个政治领导人敢说“我是山中无老虎,猴子称大王”,“我是准备跌得粉碎的;”中华民族尊重老人,尊重伟人,尊重英雄,有着宽阔博大的包容性。为什么不能大张旗鼓地在主流媒体上,在社会主义的伟大实践中提倡毛泽东思想呢?连汉武帝、唐太宗、康熙、乾隆、蒋介石、孙中山都有人赞美,为什么毛主席这近代的、身边的、空前伟大的领袖不能光明正大地对待呢?难道真要像一位韩国女大学生在一篇文章中指责的“中国人在背叛伟大的先辈”吗? 中国是个世界大国,必须有自己的哲学、文化、价值观、安全、尊严、发展战略以及政治的感召力,仅仅靠冷冰冰的钱是解决不了这些问题的。而毛泽东思想、著述正是华夏文明最科学最辉煌的宝库,是振兴中华造福人民和谐世界的指南,我们有什么必要舍近求远、匍伏在西方的洋教条下!XXX说过:"毛泽东思想过去是中国革命的旗帜,今后将永远是中国社会主义事业和反霸权主义事业的旗帜,我们将永远高举毛泽东思想的旗帜前进。"胡锦涛总书记在中共中央举办的“纪念毛主席诞辰110周年座谈会上的讲话”明确提出:“在任何时候任何情况下,我们都要始终高举毛泽东思想伟大旗帜。” 随着时日的推进,我们中国年轻一代将更进一步的理解毛泽东,认识毛泽东,真实感受全心全意为人民服务的毛泽东;毛泽东必将成为年轻一代心目中最神圣的偶像。 网络视频 谁先死?在经济繁荣期,VC可以期望着用资金慢慢培养视频网站,等待其将流量转化为广告收入;而现在金融危机着实让VC食不果腹,依赖VC的视频网站们生活状况大不如前。今天就来预测下内这几家网络视频公司谁最有可能先死,再做个死亡排序。首先声明下,这是预测也可以说是我胡诌,看客们不要采信,仅供娱乐!易死亡程度为本文杜撰的一个标准,数值越大,越容易死亡。 视频分享网站死亡顺序预测 1、56 我乐网 可以说我乐网已经死了,自从被关闭1个月后就一蹶不振,也跌出了主流视频网站的行列。目前据说56已经转型做widget。易死亡程度:5级 2、六间房 其实也可以说六间房已经死了。面对这次金融危机,六间房已经裁员7成,现在仅剩50多人。六间房的融的钱也是这几家中最少的,现在存有现金也是最少的。不管从网站流量还是将来再融资能力,六间房的实力都值得怀疑,所以最有可能步56后尘。易死亡程度:4级 3、酷六网 酷六不管在资金和网站流量上都不及优酷网和土豆网。虽然今年7月份宣布融到5000万美金(也有说3000万美金),但由于受到金融危机的影响,这笔资金极有可能仅到位一部分。假使第二笔融资已到帐1500万美金,那酷六仅凭借1500万美金度过这个寒冬,十分悬。易死亡程度:3级 4、优酷网 优酷网是这几家视频分享网站中钱最多的,但也是成本最高的。按照目前优酷网公布的相关数据,优酷网月运营成本约在3000万人民币左右。优酷网目前的融资有近1亿美金的总额,不过其中有不少是“过桥贷款”,而“过桥贷款”也被要求在规定期限内需要分期归还,所以优酷网的资金链非常紧张,一旦断裂将全面崩盘。易死亡程度:2级 5、土豆网 土豆网是这几家中相对会是最晚死的,钱比较多,每月成本相对优酷网少差不多三分之一,目前也在准备向FLV+P2P的方向过渡,要是这个金融危机不太长,应该能扛下来。易死亡程度:1级 P2P网站死亡顺序预测 1、PPLIVE 虽然作为P2P行业的先驱企业,PPLIVE在这次金融危机中受的震荡比较大。在这次危机爆发的时候,PPLIVE宣布将融资2000万美金,虽然在10 月初PPLIVE透露融资到位,但接着PPLIVE的大裁员说明了PPLIVE极有可能融资流产。PPLIVE现在手头现金应该不多,想度过这个冬天比较困难。易死亡程度:3级 2、PPSTREAM PPSTREAM的公布的融资额目前仅有1100多万美金,今年年初也传出PPStream也由于资金的问题,不得不中止了包括NBA在内的正常合作项目。虽然后来PPS通过渠道融到了一些钱渡过了难关,但相信量也不会很大。易死亡程度:2级 3、UUSEE 悠视网UUSEE是P2P这三家中融资额最多的,公布的融资总额为3550万美金,比前两家融资额的总和还高。要是这场经济危机不太长,相信能挺过去。易死亡程度:1级 今天我说的仅有视频分享网站和P2P网站。严格来说应该还有视频点播网站,但由于国内目前的点播网站大多是类似九州梦网、激动网这样的从运营商平台转过来的,有着相对不错的现金积累和运营经验,其他营收业务也不错,这次危机对他们的影响不是很大,所以这里就不扯皮了。 分享 VC6 标准版(visual C++ 6 standard)http://www.rayfile.com/files/eeaad5b5-b44b-11dd-81ba-0014221b798a/
它和常见的VC6企业版不同,它不含VB等其他开发工具,是VC的独立版本,压缩后大小仅为70M,推荐使用. 11月18日 5分钟让你整明白美国金融危机爆发的原因一。杠杆。目前,许多投资银行为了赚取暴利,采用20-30倍杠杆操作,假设一个银行A自身资产为30亿,30倍杠杆就是900亿。也就是说,这个银行A以 30亿资产为抵押去借900亿的资金用于投资,假如投资盈利5%,那么A就获得45亿的盈利,相对于A自身资产而言,这是150%的暴利。反过来,假如投资亏损5%,那么银行A赔光了自己的全部资产还欠15亿。 二。 CDS合同。由于杠杆操作高风险,所以按照正常的规定,银行不运行进行这样的冒险操作。所以就有人想出一个办法,把杠杆投资拿去做“保险”。这种保险就叫 CDS。比如,银行A为了逃避杠杆风险就找到了机构B。机构B可能是另一家银行,也可能是保险公司,诸如此类。A对B说,你帮我的贷款做违约保险怎么样,我每年付你保险费5千万,连续10年,总共5亿,假如我的投资没有违约,那么这笔保险费你就白拿了,假如违约,你要为我赔偿。A想,如果不违约,我可以赚 45亿,这里面拿出5亿用来做保险,我还能净赚40亿。如果有违约,反正有保险来赔。所以对A而言这是一笔只赚不赔的生意。B是一个精明的人,没有立即答应A的邀请,而是回去做了一个统计分析,发现违约的情况不到1%。如果做一百家的生意,总计可以拿到500亿的保险金,如果其中一家违约,赔偿额最多不过 50亿,即使两家违约,还能赚400亿。A,B双方都认为这笔买卖对自己有利,因此立即拍板成交,皆大欢喜。 三。 CDS市场。B做了这笔保险生意之后,C在旁边眼红了。C就跑到B那边说,你把这100个CDS卖给我怎么样,每个合同给你2亿,总共200亿。B想,我的400亿要10年才能拿到,现在一转手就有200亿,而且没有风险,何乐而不为,因此B和C马上就成交了。这样一来,CDS就像股票一样流到了金融市场之上,可以交易和买卖。实际上C拿到这批CDS之后,并不想等上10年再收取200亿,而是把它挂牌出售,标价220亿;D看到这个产品,算了一下,400亿减去220亿,还有180亿可赚,这是“原始股”,不算贵,立即买了下来。一转手,C赚了20 亿。从此以后,这些CDS就在市场上反复的抄,现在CDS的市场总值已经抄到了62万亿美元。 四。 次贷。上面 A,B,C,D,E,F....都在赚大钱,那么这些钱到底从那里冒出来的呢?从根本上说,这些钱来自A以及同A相仿的投资人的盈利。而他们的盈利大半来自美国的次级贷款。人们说次贷危机是由于把钱借给了穷人。笔者对这个说法不以为然。笔者以为,次贷主要是给了普通的美国房产投资人。这些人的经济实力本来只够买自己的一套住房,但是看到房价快速上涨,动起了房产投机的主意。他们把自己的房子抵押出去,贷款买投资房。这类贷款利息要在8%-9%以上,凭他们自己的收入很难对付,不过他们可以继续把房子抵押给银行,借钱付利息,空手套白狼。此时A很高兴,他的投资在为他赚钱;B也很高兴,市场违约率很低,保险生意可以继续做;后面的C,D,E,F等等都跟着赚钱。 五。次贷危机。房价涨到一定的程度就涨不上去了,后面没人接盘。此时房产投机人急得像热锅上的蚂蚁。房子卖不出去,高额利息要不停的付,终于到了走头无路的一天,把房子甩给了银行。此时违约就发生了。此时A感到一丝遗憾,大钱赚不着了,不过也亏不到那里,反正有B做保险。B也不担心,反正保险已经卖给了C。那么现在这份CDS保险在那里呢,在G手里。G刚从F手里花了300亿买下了 100个CDS,还没来得及转手,突然接到消息,这批CDS被降级,其中有20个违约,大大超出原先估计的1%到2%的违约率。每个违约要支付50亿的保险金,总共支出达1000亿。加上300亿CDS收购费,G的亏损总计达1300亿。虽然G是全美排行前10名的大机构,也经不起如此巨大的亏损。因此G 濒临倒闭。 六。金融危机。如果G倒闭,那么A花费5亿美元买的保险就泡了汤,更糟糕的是,由于A采用了杠杆原理投资,根据前面的分析,A 赔光全部资产也不够还债。因此A立即面临破产的危险。除了A之外,还有A2,A3,...,A20,统统要准备倒闭。因此G,A,A2,...,A20一起来到美国财政部长面前,一把鼻涕一把眼泪地游说,G万万不能倒闭,它一倒闭大家都完了。财政部长心一软,就把G给国有化了,此后A,...,A20的保险金总计1000亿美元全部由美国纳税人支付。 七。美元危机。上面讲到的100个CDS的市场价是300亿。而CDS市场总值是62万亿,假设其中有10%的违约,那么就有6万亿的违约CDS。这个数字是 300亿的200倍。如果说美国*收购价值300亿的CDS之后要赔出1000 亿。那么对于剩下的那些违约CDS,美国*就要赔出20万亿。如果不赔,就要看着A20,A21,A22等等一个接一个倒闭。无论采取什么措施,美元大贬值已经不可避免。 以上计算所用的假设和数字同实际情况会有出入,但美国金融危机的严重性无法低估。 vcpkg 4.11.重写命令行分析程序
2.增加对gcc等编译器支持,现在可以在vc6中直接基本透明调用gcc后端实现编译了.
下一班会增加什么特性呢?
1.可能增加分布式编译
2.可能增加跨平台编译
3.可能增加对VC2003等后续IDE的支持.(我只支持VAX支持的IDE,谁让我打字特别慢呢.)
4.可能增加VC6 IDE读取后续版本VC生成的debug信息的能力
献给所有和我一样的VC6 IDE的疯狂爱好者.
vcpkg仅支持VC6 SP6的IDE(英文企业版,其他版本未作测试),支持VC,ICC,PellesC,mingW,等大部分C/C++编译器(理论上支持,未作详尽测试,我一般用VC6+ICC10)
while(1)
{
patch();
create();
}
模仿是人类的天性,逆向是学习的捷径.
道德底线(商业道德)大家都常说,做人要对得起良心,但许多人做事却未必如此.
多年前曾看到过一个血贩子(又称血头)的人,从事着非法搜集血液的工作,其中不乏含艾滋病/乙肝等的本不应被采集的血液,后来自己的家人也住院需要输血,或许应验了中国那句古话,恶有恶报,"不幸"患上了艾滋病,不能说他家人用的血就是他组织搜集的,但显然与他这行业的人有关.
在一些搜索引擎公司工作的朋友也曾多次说,自己也不用自己公司的搜索,因为找不到自己所需的信息.估计这不是他们个别人的观点.
11月14日 完成 vcpkg4.0这次更新放弃了ini的配置文件,改用xml来存储,大部分节点支持引用外部文件.
也趁这个机会,重写了程序框架,命令行分析等没有修改.
包含以下特性:
1.支持多平台编译
2.支持绕过VC6的枚举/加载过程,从而可以直接加载VAX等插件
3.支持加载注册表修改文件,自动修改注册表
4.支持自定义VC6字体
平台编译部分特性
1.支持全局变量
2.支持每编译器的变量,环境变量,可向前相互引用
3.无需修改VC6的任何文件,即可支持任意平台的编译,增加编译器的支持只需要增加对应的配置文件即可,可以用 宏或linker参数指定编译器
4.支持对VC6输出的命令行做修改,例如重新定义编译工具(cl,link,rc),映射参数等
11月13日 关于std::list的sort函数在VC6下的修正在vc6中list的merge和sort操作有些问题,总是不能使用自己定义的比较远算伪函数,如何解决呢?
找到 typedef greater<_Ty> _Pr3;(它在merge上方)
修改成 template<class _Pr3>
下面的void sort(_Pr3 _Pr),在其上方加上 template<class _Pr3>
也就是说,把merge和sort都变成模板函数. 11月12日 世界之窗的配置莫名消失世界之窗似乎自动更新,根据运行次数或者别的信息定期自动重置配置文件,导致用户的使用配置丢失.
从安全起见,在host中加入以下信息:
127.0.0.1 ioage.com
127.0.0.1 www.ioage.com 127.0.0.1 download.theworld.cn 127.0.0.1 theworld.cn 127.0.0.1 www.theworld.cn 如果使用https,ftp,还是使用IE7之类的新版IE比较好,自带多标签页面.
11月11日 Makefile学习教程: 跟我一起写 Makefile作者:陈皓. 来源:http://www.csdn.net
0 Makefile概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。
0.1 关于程序的编译和链接在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。 总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File. 好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。
1 Makefile 介绍make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。 首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。 1.1 Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。target ... : prerequisites ... command ... ...target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。 prerequisites就是,要生成那个target所需要的文件或是目标。 command也就是make需要执行的命令。(任意的Shell命令) 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。 说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:) 1.2 一个示例正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。 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
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 main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
反斜杠(\)是换行符的意思。这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。
在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。 在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。 这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。
1.3 make是如何工作的在默认的方式下,也就是我们只输入make命令。那么,
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。 通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。 于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o的文件也是最新的啦,于是file.o的文件修改时间要比edit要新,所以edit也会被重新链接了(详见edit目标文件后定义的命令)。 而如果我们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并且,edit会被重链接。 1.4 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 变量就可以了。 关于变量更多的话题,我会在后续给你一一道来。 1.5 让make自动推导GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.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是个伪目标文件。
关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。 1.6 另类风格的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文件,那就理不清楚了。
1.7 清空目标文件的规则每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。一般的风格都是: clean:
rm edit $(objects)
更为稳健的做法是: .PHONY : clean
clean :
-rm edit $(objects)
前面说过,.PHONY意思表示clean是一个“伪目标”,。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。
上面就是一个makefile的概貌,也是makefile的基础,下面还有很多makefile的相关细节,准备好了吗?准备好了就来。 2 Makefile 总述2.1 Makefile里有什么?Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。 2.2Makefile的文件名默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“--file”参数,如:make -f Make.Linux或make --file Make.AIX。 2.3 引用其它的Makefile在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:include <filename> 在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句: include foo.make *.mk $(bar)等价于: include foo.make a.mk b.mk c.mk e.mk f.mkmake命令开始时,会把找寻include所指出的其它Makefile,并把其内容安置在当前的位置。就好像C/C++的#include指令一样。如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:
如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。如果你想让make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”。如: -include <filename> 2.4 环境变量 MAKEFILES如果你的当前环境中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于include的动作。这个变量中的值是其它的Makefile,用空格分隔。只是,它和include不同的是,从这个环境变中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。但是在这里我还是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的Makefile都会受到它的影响,这绝不是你想看到的。在这里提这个事,只是为了告诉大家,也许有时候你的Makefile出现了怪事,那么你可以看看当前环境中有没有定义这个变量。 2.5 make的工作方式GNU的make工作时的执行步骤入下:(想来其它的make也是类似)
1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。 当然,这个工作方式你不一定要清楚,但是知道这个方式你也会对make更为熟悉。有了这个基础,后续部分也就容易看懂了。 3 Makefile书写规则规则包含两个部分,一个是依赖关系,一个是生成目标的方法。 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。 好了,还是让我们来看一看如何书写规则。 3.1 规则举例 foo.o : foo.c defs.h # foo模块
cc -c -g foo.c
看到这个例子,各位应该不是很陌生了,前面也已说过,foo.o是我们的目标,foo.c和defs.h是目标所依赖的源文件,而只有一个命令“cc -c -g foo.c”(以Tab键开头)。这个规则告诉我们两件事:
3.2 规则的语法 targets : prerequisites
command
...
或是这样: targets : prerequisites ; command
command
...
targets是文件名,以空格分开,可以使用通配符。一般来说,我们的目标基本上是一个文件,但也有可能是多个文件。
command是命令行,如果其不与“target:prerequisites”在一行,那么,必须以[Tab键]开头,如果和prerequisites在一行,那么可以用分号做为分隔。(见上) prerequisites也就是目标所依赖的文件(或依赖目标)。如果其中的某个文件要比目标文件要新,那么,目标就被认为是“过时的”,被认为是需要重生成的。这个在前面已经讲过了。 如果命令太长,你可以使用反斜框(‘\’)作为换行符。make对一行上有多少个字符没有限制。规则告诉make两件事,文件的依赖关系和如何成成目标文件。 一般来说,make会以UNIX的标准Shell,也就是/bin/sh来执行命令。 3.3 在规则中使用通配符如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make支持三各通配符:“*”,“?”和“[...]”。这是和Unix的B-Shell是相同的。 波浪号(“~”)字符在文件名中也有比较特殊的用途。如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录。(这些都是Unix下的小知识了,make也支持)而在Windows或是MS-DOS下,用户没有宿主目录,那么波浪号所指的目录则根据环境变量“HOME”而定。 通配符代替了你一系列的文件,如“*.c”表示所以后缀为c的文件。一个需要我们注意的是,如果我们的文件名中有通配符,如:“*”,那么可以用转义字符“\”,如“\*”来表示真实的“*”字符,而不是任意长度的字符串。 好吧,还是先来看几个例子吧: clean:
rm -f *.o
上面这个例子我不不多说了,这是操作系统Shell所支持的通配符。这是在命令中的通配符。 print: *.c
lpr -p $?
touch print
上面这个例子说明了通配符也可以在我们的规则中,目标print依赖于所有的[.c]文件。其中的“$?”是一个自动化变量,我会在后面给你讲述。 objects = *.o上面这个例子,表示了,通符同样可以用在变量中。并不是说[*.o]会展开,不!objects的值就是“*.o”。Makefile中的变量其实就是C/C++中的宏。如果你要让通配符在变量中展开,也就是让objects的值是所有[.o]的文件名的集合,那么,你可以这样: objects := $(wildcard *.o)这种用法由关键字“wildcard”指出,关于Makefile的关键字,我们将在后面讨论。 3.4 文件搜寻在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。 Makefile文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。 VPATH = src:../headers上面的的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方) 另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不同的搜索目录中。这是一个很灵活的功能。它的使用方法有三种:
vapth使用方法中的< pattern>需要包含“%”字符。“%”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”结尾的文件。< pattern>指定了要搜索的文件集,而< directories>则指定了的文件集的搜索的目录。例如: vpath %.h ../headers该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件。(如果某文件在当前目录没有找到的话) 我们可以连续地使用vpath语句,以指定不同搜索策略。如果连续的vpath语句中出现了相同的< pattern>,或是被重复了的< pattern>,那么,make会按照vpath语句的先后顺序来执行搜索。如: vpath %.c foo
vpath % blish
vpath %.c bar
其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。 vpath %.c foo:bar
vpath % blish
而上面的语句则表示“.c”结尾的文件,先在“foo”目录,然后是“bar”目录,最后才是“blish”目录。
3.5 伪目标最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”, clean:
rm *.o temp
正像我们前面例子中的“clean”一样,即然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)
因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。 当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。 .PHONY : clean只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。于是整个过程可以这样写: .PHONY: clean
clean:
rm *.o temp
伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目标文件都写在一个Makefile中,那么你可以使用“伪目标”这个特性: all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
我们知道,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。
随便提一句,从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子: .PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
“make clean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“make cleanall”和“make cleanobj”和“make cleandiff”命令来达到清除不同种类文件的目的
3.6 多目标Makefile的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是我们就能把其合并起来。当然,多个目标的生成规则的执行命令是同一个,这可能会可我们带来麻烦,不过好在我们的可以使用一个自动化变量“$@”(关于自动化变量,将在后面讲述),这个变量表示着目前规则中所有的目标的集合,这样说可能很抽象,还是看一个例子吧。 bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
其中,-$(subst output,,$@)中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数。关于函数,将在后面讲述。这里的这个函数是截取字符串的意思,“$@”表示目标的集合,就像一个数组,“$@”依次取出目标,并执于命令。
3.7 静态模式静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法: <targets ...>: <target-pattern>: <prereq-patterns ...> <commands> ... targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。 target-parrtern是指明了targets的模式,也就是的目标集模式。 prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。 这样描述这三个东西,可能还是没有说清楚,还是举个例子来说明一下吧。如果我们的<target-parrtern>定义成“%.o”,意思是我们的集合中都是以“.o”结尾的,而如果我们的<prereq-parrterns>定义成“%.c”,意思是对<target-parrtern>所形成的目标集进行二次定义,其计算方法是,取<target-parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。 所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果你的文件名中有“%”那么你可以使用反斜杠“\”进行转义,来标明真实的“%”字符。 看一个例子: objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foo bar”,并为其加下“.c”的后缀,于是,我们的依赖目标就是“foo.c bar.c”。而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也褪恰癴oo.o bar.o”)。于是,上面的规则展开后等价于下面的规则: foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那会一个很强大的功能。再看一个例子: files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<
$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$filter”集,只要其中模式为“%.o”的内容。其的它内容,我就不用多说了吧。这个例字展示了Makefile中更大的弹性。 3.8 自动生成依赖性在Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是: main.o : main.c defs.h但是,如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在加入或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作。为了避免这种繁重而又容易出错的事情,我们可以使用C/C++编译的一个功能。大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命令: cc -M main.c其输出是: main.o : main.c defs.h于是由编译器自动生成的依赖关系,这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。 gcc -M main.c的输出是: main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
/usr/include/bits/sched.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
/usr/include/bits/stdio_lim.h
gcc -MM main.c的输出则是: main.o: main.c defs.h那么,编译器的这个功能如何与我们的Makefile联系在一起呢。因为这样一来,我们的Makefile也要根据这些源文件重新生成,让Makefile自已依赖于源文件?这个功能并不现实,不过我们可以有其它手段来迂回地实现这一功能。GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。 于是,我们可以写出[.c]文件和[.d]文件的依赖关系,并让make自动更新或自成[.d]文件,并把其包含在我们的主Makefile中,这样,我们就可以自动化地生成每个文件的依赖关系了。 这里,我们给出了一个模式规则来产生[.d]文件: %.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
这个规则的意思是,所有的[.d]文件依赖于[.c]文件,“rm -f $@”的意思是删除所有的目标,也就是[.d]文件,第二行的意思是,为每个依赖文件“$<”,也就是[.c]文件生成依赖文件,“$@”表示模式“%.d”文件,如果有一个C文件是name.c,那么“%”就是“name”,“$$$$”意为一个随机编号,第二行生成的文件有可能是“name.d.12345”,第三行使用sed命令做了一个替换,关于sed命令的用法请参看相关的使用文档。第四行就是删除临时文件。 总而言之,这个模式要做的事就是在编译器生成的依赖关系中加入[.d]文件的依赖,即把依赖关系: main.o : main.c defs.h转成: main.o main.d : main.c defs.h于是,我们的[.d]文件也会自动更新了,并会自动生成了,当然,你还可以在这个[.d]文件中加入的不只是依赖关系,包括生成的命令也可一并加入,让每个[.d]文件都包含一个完赖的规则。一旦我们完成这个工作,接下来,我们就要把这些自动生成的规则放进我们的主Makefile中。我们可以使用Makefile的“include”命令,来引入别的Makefile文件(前面讲过),例如: sources = foo.c bar.c
include $(sources:.c=.d)
上述语句中的“$(sources:.c=.d)”中的“.c=.d”的意思是做一个替换,把变量$(sources)所有[.c]的字串都替换成[.d],关于这个“替换”的内容,在后面我会有更为详细的讲述。当然,你得注意次序,因为include是按次来载入文件,最先载入的[.d]文件中的目标会成为默认目标
4 Makefile 书写命令每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以Tab键开头的,那么make会认为其是一个空命令。 我们在UNIX下可能会使用不同的Shell,但是make的命令默认是被“/bin/sh”——UNIX的标准Shell解释执行的。除非你特别指定一个其它的Shell。Makefile中,“#”是注释符,很像C/C++中的“//”,其后的本行字符都被注释。
4.1 显示命令通常,make会把其要执行的命令行在命令执行前输出到屏幕上。当我们用“@”字符在命令行前,那么,这个命令将不被make显示出来,最具代表性的例子是,我们用这个功能来像屏幕显示一些信息。如: @echo 正在编译XXX模块......当make执行时,会输出“正在编译XXX模块......”字串,但不会输出命令,如果没有“@”,那么,make将输出: echo 正在编译XXX模块......
正在编译XXX模块......
如果make执行时,带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令,这个功能很有利于我们调试我们的Makefile,看看我们书写的命令是执行起来是什么样子的或是什么顺序的。
而make参数“-s”或“--slient”则是全面禁止命令的显示。
4.2 命令执行当依赖目标新于目标时,也就是当规则的目标需要被更新时,make会一条一条的执行其后的命令。需要注意的是,如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。比如你的第一条命令是cd命令,你希望第二条命令得在cd之后的基础上运行,那么你就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用分号分隔。如: 示例一:
exec:
cd /home/hchen
pwd
示例二:
exec:
cd /home/hchen; pwd
当我们执行“make exec”时,第一个例子中的cd没有作用,pwd会打印出当前的Makefile目录,而第二个例子中,cd就起作用了,pwd会打印出“/home/hchen”。 make一般是使用环境变量SHELL中所定义的系统Shell来执行命令,默认情况下使用UNIX的标准Shell——/bin/sh来执行命令。但在MS-DOS下有点特殊,因为MS-DOS下没有SHELL环境变量,当然你也可以指定。如果你指定了UNIX风格的目录形式,首先,make会在SHELL所指定的路径中找寻命令解释器,如果找不到,其会在当前盘符中的当前目录中寻找,如果再找不到,其会在PATH环境变量中所定义的所有路径中寻找。MS-DOS中,如果你定义的命令解释器没有找到,其会给你的命令解释器加上诸如“.exe”、“.com”、“.bat”、“.sh”等后缀。
4.3 命令出错每当命令运行完后,make会检测每个命令的返回码,如果命令返回成功,那么make会执行下一条命令,当规则中所有的命令成功返回后,这个规则就算是成功完成了。如果一个规则中的某个命令出错了(命令退出码非零),那么make就会终止执行当前规则,这将有可能终止所有规则的执行。 有些时候,命令的出错并不表示就是错误的。例如mkdir命令,我们一定需要建立一个目录,如果目录不存在,那么mkdir就成功执行,万事大吉,如果目录存在,那么就出错了。我们之所以使用mkdir的意思就是一定要有这样的一个目录,于是我们就不希望mkdir出错而终止规则的运行。 为了做到这一点,忽略命令的出错,我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。如: clean:
-rm -f *.o
还有一个全局的办法是,给make加上“-i”或是“--ignore-errors”参数,那么,Makefile中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。
还有一个要提一下的make的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。 4.4 嵌套执行make在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而不至于把所有的东西全部写在一个Makefile中,这样会很难维护我们的Makefile,这个技术对于我们模块编译和分段编译有着非常大的好处。 例如,我们有一个子目录叫subdir,这个目录下有个Makefile文件,来指明了这个目录下文件的编译规则。那么我们总控的Makefile可以这样书写: subsystem:
cd subdir && $(MAKE)
其等价于:
subsystem:
$(MAKE) -C subdir
避免仰视名人/伟人常看到或听到身边的人讨论 某某名人/伟人(为简略,下称名人) 如何如何成功,如何如何伟大,殊不知,这种讨论或许满足了发泄口水的需求,却从另一个角度打击或降低了自己的自信.没有一蹴而就的美差,最重要的是踏踏实实的一步一步做好,积跬步致千里. |
|
|