2010年6月23日星期三

[转]简单流程很有用 iPhone程序开发新手教程

  1. Mac

  如果不考虑二手的话, 最便宜的组合应该是Mac mini + 普通外接硬件(如果你没有苹果电脑).

  当然网上也可以找到不少在PC上安装 OS X 的方法, 比较麻烦, 风险自担.

  如果你要买二手机器, 确保是Intel处理器, PowerPC的不支持.

  2. iPhone/iPod touch

  最新款的iPhone和iPod touch, 差别不是很大. 如果你不是开发以下相关程序:

  磁力计相关

  语音相关

  如果你需要将自己的程序安装到iPhone/iPod touch上, 则必须先注册成为iPhone Developer(详见下文), 否则只能在模拟器上运行.

  入门视频

  地址: http://developer.apple.com/iphone/index.action

  强烈建议先看一遍.

  只要有普通的Apple ID就可以下载观看, 如果你还在犹豫是否要付那100美元时, 可以先用此视频来了解一下iPhone程序开发的一些基本概念, 然后稍微熟悉一下Objective-C略显古怪的语法, 最后再在模拟器上转一转自己的程序. 如果有很大兴趣做下去, 再付钱也不迟.

  注册开发者帐号

  地址: http://developer.apple.com/

  费用: 100美元/年

  如上所说, 只有注册会员才可以安装程序到设备上.

  相关资料

  1. 斯坦福iPhone程序开发课程

  地址: http://www.stanford.edu/class/cs193p/cgi-bin/index.php

  里面包含了课件, 示例代码, 作业, 视频下载地址. 非常非常好的资源!

  这门课程的老师(其实很年轻)都是苹果的在职员工. 其中来客串演讲的有苹果各个项目的开发人员, 还有包括Tweetie的作者这种已经很成功的iPhone程序开发者.

  2. blog及论坛

  https://devforums.apple.com/community/iphone 苹果官方的开发论坛

  http://www.cocoabuilder.com 很有名的cocoa开发站点

  http://furbo.org/ Twitterrific的开发人员

  http://www.cimgf.com/ 著名的 cocoa is my girlfriend

  http://cocoadevcentral.com/ 又好看又实用

  3. 书我没看过, 不过似乎现在已经不少了.

  总结

[转]创建金苹果,靠苹果软件赚钱的几个例子

苹果的软件商店已经有数万个程序,很多人也因此翻身发家,news.cnet.com就报道了三个这样的故事.

  第一个:iShoot,去年八月,SUN的工程师Ethan Nicholas 与老婆Nicole一度为钱伤脑筋,房贷快付不出来、小孩子的医疗费又不断累积,加上SUN又冻结了当年度员工分红,Nicholas不得不开始寻找新工作,还开始委托出售自己的房子.但之后他突然想起曾读过一篇文章,有个家伙因为写了一个iPhone电玩应用叫Trism而赚了25万美元.“我那时想说,只要有其中的一点收入,就够我撑过这段时期了.”他说.

  现年30岁的Nicholas虽然有多年撰写程序经验,但却从没用过iPhone的程序语言Objective-C,他自己上网找数据,了解苹果 iPhone软件开发工具的使用方式.由于他从小喜欢玩射击电玩,因此他决定朝这方面进行,他画了一些图画,又去图库网站购买了很便宜的图片与声音文件. 有六周时间,他每天早、中、晚都在工作,白天在SUN进行Java开发,下午作他的iPhone项目,傍晚则帮他老婆照顾两个小孩,有时还得一手不断在计算机上敲键盘,另一只手则摇着最小的孩子的Gavin的摇篮让他入睡,或者抱着放在膝盖上的老大Spencer.

  完工后,Nicholas送给苹果审核,也很快就通过,iShoot这套应用在10月19日正式出现在苹果应用商店上.他于是在线查看苹果的账户,看看卖出几套应用,结果Nicholas的下巴差点掉了下来:头一天,每套4.99美元的iShoot让他实质赚进1000美元,他说,他跟老婆 Nicole几乎“真的跑到街上跳舞去了.”

  第二天的销售额度为2000美元.第三天,金额掉到50美元,之后连续几周每天都是维持这样的金额.“这也算是不错的小钱,但我不断思考能否做得更好.”Nicholas表示.

  今年一月,他又推出一个免费版本,但功能较少,希望藉此刺激付费版本的销售量,结果策略成功,iShoot Lite被下载次数超过200万次,许多人都升级为付费版本,且现在价格只需2.99美元.在最高峰的时候(1月11日),iShoot一天卖出1万 7000套,为Nicholas一天带来3万5000美元收入.

  “当下我立刻想到我的老板,我打电话过去跟他说,我们得谈谈.”Nicholas表示,“我说我要辞职了.”

  第一个iPhone是在2007年六月出现,但实际到了2008年七月,iPhone用户才开始可透过苹果的App Store(苹果应用商店)下载或购买软件.Nicholas靠着iShoot,五个月内赚进80万美元,但这或许不是常态.iPhone应用商店目前有超过2万5000 款应用程序,许多人写的程序可能根本都不会被注意到.但这股旋风已经形成,即使成功得靠运气,许多人一窝蜂跑去上有关iPhone程序的课程与会议.比如史丹佛大学去年秋季在大学部开了一堂课程叫“Science 193P: iPhone Application Programming”,结果50个名额引来150名学生报名.

  这股iPhone开发旋风有人以硅谷当年的dot-com兴盛期相比, 创投合伙人Matt Murphy手下有一个1亿美元专门保留给iPhone应用的iFund创投资金,他表示,“大家发现,只要花几块钱在车库里做开发,你或许就是下一个 Facebook了.行动开发现在还算早期阶段而已,未来还会更热.”

  第二个:iSteam

  另一个成功例子是住在伦敦的希腊创业者Kostas Eleftheriou,他跟另外两个朋友花了七天写了一个iSteam程序,结果三个月内就创下10万美元收入,这个软件只是会让iPhone镜面如同浴室镜子一般起雾.这只是个很简单的小把戏,若你用手指划过手机表面,iSteam会模拟雾面被划过的声音,十分逼真.若你把手机放侧边,还会产生水珠滴下.“实在太逼真了”,Eleftheriou表示,“大家都想秀给朋友看.”

  这套应用去年12月登上App Store,而现年25岁的Eleftheriou已经决定终止研究所学业,专职做iPhone开发.他跟另外两位朋友Vassilis Samolis 与 Bill Rappos(都是22岁)成立了一间公司GreatApps,另聘请了两名开发人员.

  第三个:Trism

  iSteam团队跟前述的Nicholas都是受Steve Demeter成功的激发,现年30岁的Demeter写了一个Trism应用,他在去年七月放入App Store,投两个月就赚了25万美元.他立即辞去Wells Fargo的软件工程师工作,自行成立了iPhone游戏开发公司Demiforce.Demeter表示,写这些程序花不了多少钱,但花大钱也不见得保证会成功.

  当然,这股风潮,其它手机与软件商也注意到了,上周Research in Motion便推出了BlackBerry的应用商店;Google最近也开始销售Android的应用;Nokia已经打算跟进;微软则会打造一个给 Windows Mobile手机使用的软件商店.

  至于Nicholas呢?他已经带着家人去华盛顿度假,找了一个保母来看小孩,还创立了一家公司Naughty Bits Software,未来要继续开发iPhone应用(目前他是唯一员工).另外还有投资者与知名电玩公司找他要赞助未来的计划.

【转】13款iphone软件设计工具

我们公司比较适合第二种
用途:MEDL Mobile公司出品,你提交创意,然后公司的开发团队把你的创意开发成iPhone软件。公司收到你的提交之后,你可以利用公司的“故事板”来详细描述该软件的功能需求。

价格:下载和使用该工具免费,但公司会在软件进入iTunes软件商店后提取75%抽成,剩余的25%收入归你。

http://blog.it.sohu.com/readwriteweb/archives/6786

iphone软件开发很好的两篇入门文章(稍有重复),“12步”揭开iPhone程序开发神秘面纱,

从此走上苹果之路 iPhone软件开发完美起步

http://dev.yesky.com/300/11107800.shtml

“12步”揭开iPhone程序开发神秘面纱
http://dev.yesky.com/245/11107745.shtml

【转】iphone软件开发文摘-2从此走上苹果之路 iPhone软件开发完美起步

 手机上的应用软件开发正在受到越来越多人的关注,随着中移动软件商店的上线,中国的开发者也可以进行iPhone软件开发了。软件开发的内行和外行们都在通过iPhone为大家带来出前所未有的惊喜和创新。不过对于那些门外汉来说,iPhone软件开发仍然是一个谜,那么就让我为大家揭开它的神秘面纱吧。

  1. 有一个创意,很棒的创意

  你怎么知道你的创意好不好呢?首先,如果你的创意很好,那么你一定会很在意它,时刻把它挂在嘴边,放在心中;其次你要扪心自问:是否有任何迹象表明我的创意一定能成功?

  ◆你的创意能解决一个唯一的问题吗?

  在电灯泡发明之前,有人肯定会抱怨,“我们只能在该死的蜡烛下看书吗!”想象一下那种糟糕的情形,所以你的程序应该让用户的生活更加轻松舒适。

  ◆你的应用程序是为特殊的市场服务吗?

  尽管苹果商店没有统计数据,但是随着商店中的商品数目的暴涨,使用iPhone应用程序的人数肯定在飞速增长。所以你需要和热心用户一起寻找一个特殊的市场,然后做一个只为特殊用户群服务的iPhone软件。

  ◆它可以让用户捧腹大笑吗?

  这并不需要怎么动脑筋。只要你能找到一些有趣的东西,然后用正确的方式表达出来,你的创意就是一个金点子。呵呵,我昨天花了5分钟时间来点一个写着“不要点我”的红色按钮。

  ◆你能站在巨人的肩膀上吗?

  你是否发现即使是某些成功的应用程序也存在一些不足,有很大的提升空间呢?不要只满足于显示一个葡萄酒名单,你应该写个程序让葡萄酒大师可以很自己的粉丝来交流!

  ◆你的程序会有很棒的交互性吗?

  让我们面对这个现实:大部分用户的注意力都是跳跃的。成功的应用程序用超级人性化的操作深深吸引着用户。

  行动: 你的iPhone程序符合上面任意一条吗?如果符合,那么就开始准备开发工具吧。

  2. 工具列表

  下面是你所需要的工具(带星号的是必须的,其它的虽然不是必须的,但是你最好也准备一下):

  ◆加入苹果iPhone软件开发者计划 ($99)

  ◆准备一个iPhone或iPod touch

  ◆准备一个能运行Mac OS X 10.5.5以上版本的的苹果电脑,

  ◆下载最新版本的iPhone SDK

  行动: 将一切必要物品就位.

  3.你最擅长什么?

  你最能拿到台面上的什么技术?

  你是一个对程序一窍不通的设计师?还是一个设计小白程序员呢?或者干脆你什么都不会,但是却有着一个很有市场前景的创意?做一个成功的 iPhone软件开发可不是一件容易的事,什么市场调查员呀,项目经理呀,会计师呀,信息架构师呀,设计师,程序员,营销员,广告员等等,都是你的活,你都得干。

  但是你得记住所有成功企业家都明白的一点: 一个团队才能让一件产品获得成功。别误会,我知道你很强,一个人也能搞定一切。但是,你肯定会浪费很多时间和精力。所以,别干傻事,问问自己:我最擅长干那件事?然后找一些牛人来干其他的事。这样还有一个好处就是人多力量大,大家的创意汇集在一起可以让产品更加丰富。

  技能列表

  ◆能辨别iPhone程序能干什么,不能干什么

  ◆市场调查

  ◆编写程序大纲 (建立站点地图)

  ◆原型设计

  ◆GUI设计

  ◆编程 (Objective C, Cocoa)

  ◆产品推广和营销

  记得找个合同商来签订你的NDA保密协议(译者注:目前已经不需要了,详情参阅苹果放弃iPhone软件开发NDA保密协议)。对你的合同商开诚布公的说:“我可以很负责人的告诉你,我的产品和业务就交给你了,千万别让我失望”。

  行动: 选择适合自己的技能。你干不了的还是找其他人来做吧.

  4. 家庭作业: 市场调查

  市场调查说白了就是 "看看其他人都在做什么,然后不要犯同样的错误."。正所谓前车之鉴,后事之师 ,所以接下来你要看看苹果商店里的这那些应用程序都有啥创意和设计可以借鉴的。就算你看到都是一些恶心的设计, 你也会得到启发:我可不能做出这么丑的东西来吓人。

  iPhone应用程序界面

  行动:回答下面的问题:

  你的应用程序能解决什么问题?

  你看到了有类似的应用程序吗?

  成功的应用程序是怎样向用户展示信息的?

  你怎样开发出一款独一无二的应用程序?

  你的应用程序为用户带来哪些价值?

  5. 了解iPhone/iPod Touch 的UI

  如果你想建立一个iPhone的应用程序,你必须了解iPhone的用途和界面。你能用iPhone射出.45口径的子弹吗?不能。你能用 iPhone看视频吗?可以。好消息是这些东西你没必要进行死记硬背,因为Apple用户界面指南会告诉你iPhone程序能干什么,不能干什么。

  有空多下载一些iPhone程序,然后想想你的程序中需要包含哪些功能。

  注意一下:

  iPhone程序中好的设计是怎样在页面和页面之间切换的?

  它们是怎样组织信息的?

  它们向用户展示了多少信息?

  它们是怎样利用iPhone独一无二的特点的:加速度计,摇晃特性,多点触摸,旋转功能?

  行动:每个目录下载10个程序,然后每个程序都玩玩看。看看Apple UI设计指南列出你希望添加到自己程序的特性。

  6. 决定 "谁会使用你的程序?"

  我们假设你已经非常肯定你的程序必将带来价值,你的程序会有一帮忠实的用户。好吧,准确的说,他们是狂热的粉丝,但是他们究竟是谁呢?他们到底用你的程序来做什么呢?

  如果你的程序是个游戏, 也许他们想打出更高的分数,也许他们只想尝尝鲜。你有什么办法让用户得到不同的体验,而不是堕落到成天到晚都玩你的游戏呢。

  如果你的程序是个工具 , 你的用户想快速的找到一个咖啡店,他们会在应用程序中进行怎样的操作呢?当他们找咖啡店时,他们身处何处?通常是在车中!设计一个程序需要大动干戈吗?当然不是!多从现实世界的角度出发就好了。

  行动: 列出将会使用你的程序的不同类型用户。模拟他们使用iPhone的场景,甚至你可以为他们取个名字,尽量让场景越真实越好。

  7. 把你的创意做成草图

  这是正真意义上的草图。在8.5 x 11的纸上列出9个表格,然后开始画画。

  ◆应用程序中的每一页都要展示什么?

  ◆我们怎样把用户从A引导到B,从B引导到C?

  ◆页面上的众多元素怎样排版和布局?

  当你画程序草图时,可能有时会思维枯竭导致工作停止,这时不妨试着把你的创意画成缩略图,这样可以提升你的创造空间!当然,你也可以买一个 iPhone原型工具来快速构建一个iPhone UI原型。

  行动: 程序的每一页至少画一个草图。试试不同的导航模式,不同的按钮文本和页与页之间的衔接方式。如果你想把草图转化为数字格式,iPlotz是个不错的选择。

  8.设计时间

  如果你是个设计师,那就请下载iPhone GUI Photoshop模板 或 我们的iPhone PSD矢量工具.这两个iPhone GUI工具将会节省你很多时间。如果在你绘制草图时就已经确定了布局,那么你的侧重点就要转移到应用程序设计上了。

  iPhone软件开发的界面设计

  如果你不是设计师,那就赶快请一个吧。这就像是聘用电工来作电工活一样,你可以到零售店买一些工具自己干,但是你必须冒着被烤熟的危险。如果你遵循着1到3步,那么就万事具备,只欠设计师了。

  找设计师时,最好找一个有着移动平台设计经验的人。他们可以对你的草图做一个反馈,给出一些建议来改进草图。你在这里可以找到这些设计师:Taskcity, Coroflot, Crowdspring, ELance。在这些网站上发布任务时,最好把你的需求说清楚,然后做好查看一大堆作品的准备。

  行动: 如果你是设计师,就开始用photoshop干活吧。如果你不是,那就赶快请一个吧。

  9. 编程

  当你找到设计师时,你最好也找到到了一个程序员入伙。早点和程序员谈谈,看看你的项目的预算能否和技术实现保持在同一水准。

  Xcode3.1界面截图

  如果你就是一个Objective C/Cocoa程序员,那么还等什么,打开 ,开始干活!推荐你加入以下论坛:

  ◆Cocoachina

  ◆Apple开发论坛

  ◆iPhoneSDK

  ◆iPhoneSDKForum

  ◆iPhoneDev Forums

  ◆iPhoneSB

  如果你不是程序员,你知道该咋办了吧?赶快找一个!确定你到底想开发什么类型的应用,不管它是游戏,工具还是其它什么东西。每种类型都需要不同的编程技术。你可以找到合适的程序员的地方有: Taskcity,Odesk, iPhoneFreelancer, ELance或者上面的论坛。

  10. 把你的程序提交到苹果程序商店中

  现在的问题是,如何把你的应用程序提交到苹果商店中?如果你不熟悉Xcode,那么编译程序,在iTunes Connect上发布二进制程序会很困难。这时,如果你的团队中有程序员,不妨问问他们。

  创建你的证书

  拿到自己的App ID’s

  创建你的Distribution Provisioning Profile

  编译应用程序

  上传到iTunes Connect

  行动: 如果你是个程序员,那么就定制一个开发周期,然后开始干活。如果你不是,那就赶快请一个吧

  11.推广你的程序

  俗话说 “酒香也怕巷子深”。应用程序待在苹果商店里,无人问津是很平常的事,但是不要让这件事发生在你的身上。准备一个计划来营销自己的应用程序。事实上,应该是准备一大堆计划来营销自己的应用程序。每个计划都试试,有些可能有效果,其他的则可能没有。

  应用程序销售策略:

  结合社交媒体. 如果你的用户在游戏中得到了很高的分数,那么这些用户很可能会把这件事发布到Facebook或Twitter上。想一想你程序中的功能如何和社交媒体相结合?至少,在Facebook上和Twitter上建立一个粉丝页面,以便和你的粉丝们进行交流,得到大家的反馈。

  发布前推广. 在程序发布之前,先放点风声出来. 告诉相关的写手,看看他们是不是会写一些有关你的程序即将发布的消息,最好弄得满城风雨。

  准备多次发布. 第一次发布的时候千万得有所保留,把一些功能先藏着掖着。未来的路还很长,你把东西一次发布完,以后怎么办呢?所以,先忍一忍,每隔一段时间发布一次新的版本。

  行动: 为你的市场准备20个推广策略。关注每一个策略所带来的效果(不必事必躬亲,干不了就找别人来干)。

  11. 集中精力,永不放弃!

  第 一次的做iPhone程序,总会怀着极大的憧憬,满脑子都是新念头。但是,不要让这些新的念头影响到你的工作,集中精力做好一件事。当你的第一程序投放在 苹果大河之中,虽然开始会溅起朵朵浪花,但是很快就埋没在成千上万个项目里,但千万别因此影响到你的热情,至少你的第一次是成功的。

【转】iphone软件开发文摘-1基础

MAC OS X的内核是Darwin(达尔文)

Darwin是Mac OS X和iPhone OS操作环境的操作系统部份。

Darwin是一种类Unix操作系统,集成数种的技术,包含开放源代码的XNU内核,一种以微内核为基础的内核架构来实现Mach kernel。

CodeSignature(代码认证)
identifier(标识符,识别器)

App Store的进入门槛很低,对于个人开发者来说,你只需要注册一个苹果开发者的ID,通过信用卡交纳99美元的年费,在美国政府申请一个纳税号后,便能得到在苹果的平台上展示自己的产品并销售的权力。

2008年7月,App Store正式上线时,只有1500款软件;今年3月,这个数量上涨到25000款,目前上架的软件数量高达8.5万款。如今,一款新的软件提交后,如果发布出来没有进入App Store的排行榜,将会立刻石沉大海。

如今,xxx每做一款软件,只有一个目的:冲击App Store排行榜。139.me里的每个人每天都必须看排行榜,找出上榜软件的规律。

“只有排行榜上靠前面的软件才能赚到钱。”朱连兴说,“以前一个很普通的创意,能卖一点点的钱,我们可能会做,现在我们不会了。如今,娱乐性、画面还有宣传这些会越来越重要,而不是简单的idea.”

如今的App Store市场,1%的软件赚去了99%的钱。每个软件的销售都有可能根据时间发生变化。比如今年1月,美国发生了飞机成功迫降哈德逊河事件,那时,关于控制飞机飞行类的游戏和应用软件一下子就下载量激增。

按照苹果的协议,苹果和软件开发者三七分成,再扣除三成的所得税,每个开发者最终能拿到四成的软件销售收入。

Google推出的Android软件商店。“App Store只为苹果手机服务,而Android面对的并不仅仅是一款手机。Android系统是对外开放的,联想可以用,三星也可以用。随着时间的推移,Android 的市场将拥有庞大的用户群。”

部分摘自http://www.jiaodong.net/job/system/2009/11/05/010673664_01.shtml

[转]在windows安装objective-c开发环境

1.安装GNUstep
GNUstep Windows Installer提供了Windows平台下的Objective-C的开发环境。
一共有下述四个软件包:
GNUstep System(必装)
GNUstep Core(必装)
GNUstep Devel(选装)
Cairo Backend(选装) 后台(Backend)新软件包(Cairo)
download 地址
http://www.gnustep.org/experience/Windows.html

2.编写Hello, World!

安装完成后,在开始菜单里的GNUstep选项里执行shell,就能打开命令行,在这里就可以使用vi编写Object-C程序了,不过操作起来总有些繁琐,其实也可以直接在Windows里进入C:\GNUstep\home\username目录,在这里用你喜欢的工具编写 Object-C程序,然后再进入shell里编译。

直接给出helloworld.m文件内容,取自Programming in Objective-C 2.0一书:

#import

int main (int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Hello World!");
[pool drain];

return 0;
}

第一次编译:

gcc -o helloworld helloworld.m

结果出现错误信息,找不到头文件:

helloworld.m:1:34: Foundation/Foundation.h: No such file or directory
helloworld.m: In function `main':
helloworld.m:4: error: `NSAutoreleasePool' undeclared (first use in this function)
helloworld.m:4: error: (Each undeclared identifier is reported only once
helloworld.m:4: error: for each function it appears in.)
helloworld.m:4: error: `pool' undeclared (first use in this function)
helloworld.m:5: error: cannot find interface declaration for `NXConstantString'

第二次编译:

gcc -o helloworld helloworld.m \
-I /GNUstep/System/Library/Headers/

结果出现错误信息,找不到接口声明:

helloworld.m: In function `main':
helloworld.m:5: error: cannot find interface declaration for `NXConstantString'

第三次编译:

gcc -o helloworld helloworld.m \
-fconstant-string-class=NSConstantString \
-I /GNUstep/System/Library/Headers/

结果出现错误信息,找不到链接库:

helloworld.m:(.text+0x33): undefined reference to `_objc_get_class'
helloworld.m:(.text+0x45): undefined reference to `_objc_msg_lookup'
helloworld.m:(.text+0x64): undefined reference to `_objc_msg_lookup'
helloworld.m:(.text+0x80): undefined reference to `_NSLog'
helloworld.m:(.text+0x93): undefined reference to `_objc_msg_lookup'
helloworld.m:(.text+0xbc): undefined reference to `___objc_exec_class'
helloworld.m:(.data+0x74): undefined reference to `___objc_class_name_NSAutoreleasePool'
helloworld.m:(.data+0x78): undefined reference to `___objc_class_name_NSConstantString'
collect2: ld returned 1 exit status

第四次编译:

gcc -o helloworld helloworld.m \
-fconstant-string-class=NSConstantString \
-I /GNUstep/System/Library/Headers/ \
-L /GNUstep/System/Library/Libraries/ \
-lobjc \
-lgnustep-base

注意:helloworld.m必须出现在-lobjc和-lgnustep-base的前面,否则会出错。

此时会出现一些info提示信息,不过不碍事,终于成功了生成了可执行文件,执行./helloworld.exe看结果。

快捷方式:

如果每次使用gcc的时候,都要输入这么长的命令,无疑是很恼火的事儿,我们可以做一个快捷方式:

编辑C:\GNUstep\bin\gcc.sh的文件,内容如下:

#!/bin/sh

if [ $# -ne 1 ]; then
echo "Usage: $0 name"
exit 1
fi

gcc -g -o $1 $1.m \
-fconstant-string-class=NSConstantString \
-I /GNUstep/System/Library/Headers/ \
-L /GNUstep/System/Library/Libraries/ \
-lobjc \
-lgnustep-base

exit 0

其中,gcc加入了-g参数,方便gdb调试,使用时就很方便了,注意别带扩展名m:

gcc.sh helloworld

参考链接:

Compile Objective-C Programs Using gcc
http://blog.joomla.org.tw/mobile/59-iphone/103-objective-c-gnustep.html

2010年6月21日星期一

【转】10 家不错的iphone编程资源站

随着iPhone取得巨大成功,学习如何在这样一个新的平台上面开发软件成了编程人员和开发者的必修课了,谁都不想错过这么一个大蛋糕。几乎所有的主要游戏开发者都在重新思考如何把他们的经典游戏放到iPhone平台上来。以下我们就介绍网络上一些比较重要的编程资源站点。

1. Apple iPhone Developer Center Website
当然,这是iPhone所有资源的中心。
Visit the ADC.

2. Animating a Ball Using An NSTimer
今天我将向你展示如何通过移动屏幕上面的球来做一些简单的动画。我们不会用到OpenGL ES来完成这些,而只用简单的NSTimer和UIImageView。
See the Tutorial here.

3. Stanford iPhone Programming Classes Material
拥有很不错PDF教程库来帮助你掌握iPhone编程
Visit and download your favorite ones here.

4. IBM: Develop iPhone Web applications with Eclipse
学习利用Aptana的开发插件Eclipse和iUi框架来创建iPhone网站。观摩Javadoc Viewer的开发,提供用户界面的建议,并且了解iphone软件的开发动向。
Visit the well documented material from IBM here.

5. iPhone Developers Community at iphonewebdev.com
这个网站是一个web开发者互相帮助开发iphone上最好的web程序的社区。Examples here
Visit phonewebdev.com here.

6. iphoney
基于Safari的iPhone模拟器帮助你在发布前完善你的程序
Download iPhoney here.

7. 35 Free Icon Sets for your iPhone
收集了最为精美,易用的iphone图标以便你用在自己的程序上
Visit speckyboy.com here.

8. Learn How To Develop For The iPhone
我们将教你如何知道一个用户是否使用iPhone来访问这个页面,并且探测他是水平的还是竖直的浏览。
Check this well explained tutorial here.

9. iPhone application development, step by step
知道Apple采用Ajax作为iPhone程序开发的SDK时,我们很兴奋能够为它开发一个OpenLaszlo程序
Check these interesting tutorials for the iPhone application development here.

10. iPhone Toolbox
最为全面的iPhone资源网站之一,包含成百的优质教学和技巧文档,让你的开发过程变得简单。
Visite the iPhonetoolbox.com here.

Cocoa China 苹果开发中文站
Mac/iPhone开发都有

进阶级应用及开发 - WeiPhone威锋网 iPhone 论坛
不错的论坛

「转」iPhone 的操作系统介绍

http://topic.csdn.net/u/20080311/09/ea16ed08-24f3-48f8-a776-f904f873e661.html

学习object c,记录一些帖子

苹果开发中文网站
http://www.cocoachina.com/
http://www.cocoachina.com/index.php/archives/cocoachina_122.html
Linux安装
http://majianglin.javaeye.com/blog/250856
http://changyy.pixnet.net/blog/post/25343618
开始学吧object-c
http://www.otierney.net/objective-c.html.zh-tw.big5

参考书
★入門 Objective-C 2.0 (Programmer’s SELECTION) (大型本)
7位 ─ 本 > コンピュータ・インターネット > インターネット・Web開発 > Web 開発
2位 ─ 本 > コンピュータ・インターネット > 一般・入門書 > プログラミング入門書
14位 ─ 本 > コンピュータ・インターネット > プログラミング
★XcodeによるObjective-C入門 (単行本(ソフトカバー))
22位 ─ 本 > コンピュータ・インターネット > プログラミング
★iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩 (単行本)
3位 ─ 本 > コンピュータ・インターネット > プログラミング
★詳解 Objective-C 2.0 (大型本)
1位 ─ 本 > コンピュータ・インターネット > データベース
1位 ─ 本 > コンピュータ・インターネット > コンピュータサイエンス > データベース処理
4位 ─ 本 > 科学・テクノロジー > 工学
★Objective-C逆引きハンドブック (単行本(ソフトカバー))
33位 ─ 本 > コンピュータ・インターネット > プログラミング

【转贴】如何在没有QT的机器上发布

最近需要发布QT开发的程序,在网上查了一些咨询,整理到这里,备用。

三个方法:静态编译、复制DLL、路径设置(已有DLL)
最佳解觉方案 复制DLL,官方都推荐这样

①复制DLL
步骤1:make release,编译出release版本

步骤2:用depends(※1)看一下缺少哪个库
需要的工具Dependency Walker(主页:http://dependencywalker.com/),
可以用来查看可执行文件依赖的dll动态链接库。

步骤3:依次查看各个DLL的位置,拷贝到可执行文件的目录。
之后即可在没有安装Qt的Windows机器上运行。
在最简单的情况下,依赖的DLL都在类似D:/qt/2010.01/qt/bin目录中,分别是 mingwm10.dll,QtCore4.dll,QtGui4.dll 和 libgcc_s_dw2-1.dll。

注意:如果使用Debug版的可执行文件,会出现“没有找到QtCored4.dll”的错误。是由于Debug版依赖的是 QtCored4.dll,QtGuid4.dll 和 libgcc_s_dw2-1.dll的缘故。QtCored4.dll约28.89MB,而QtGuid4.dll约140.5MB。

另外,转网络上的一段:

程序中默认只支持png图片,如果使用了gif,jpg等格式的文件是显示不出来的。需要将Qt安装目录下的qt/plugins/目录中的 imageformats文件夹拷贝到exe文件目录下(注意是整个文件夹)。而 imageformats 文件夹中只需要保留你需要的文件,例如你只需要支持gif文件,就只保留qgif4.dll即可。

②静态编译(elva:还没有实践,仅作备份)

静态编译,生成的文件就只有一个exe

所以我们可以采用静态编译,静态编译后的Qt就不需要再拷贝这3个dll文件了,首先需要修改位于\mkspecs \win32-g++下的qmake.conf,在QMAKE_LFLAGS标签中增加-static。然后在“开始”菜单中运行Qt 4.4.3 Command Prompt程序,会启动一个命令行界面。再里面打入configure -static -release -no-exceptions。接受里面提到的许可之后,就会开始编译生成qmake并进行配置。配置完成以后,再输入mingw32-make sub-src。这样就开始对Qt进行编译,这步需要很长时间。然后再像以前这样重新编译和生成自己写的程序,这样的生成的可执行程序就是使用静态链接的,可以直接在未安装Qt的电脑上运行。

2010年6月14日星期一

[转贴]如何生成静态库。

我们知道静态库也称档案库,在此档案文件中实际上是收集了一系列的目标文件。这
些目标文件就是由 cc(gcc)函数的源代码编译生成的。因此,静态库的生成方法实际上
可以分成两步:
1.将各函数代码所在的源文件编译成目录文件。例如,对于myfunc.c,可以用如下命令
将其编译成目标文件:
gcc -c myfunc.c
当然在有多个源文件时,只需在gcc 命令行中将其分别列上就可以了。
经此一步我休养将能够得到各源文件的目标文件。对上例,将得到myfunc.o
2.将各目标文件收集起来放到一个静态库文件中。这主要借助于ar命令完成,如:
ar r ~/lib/libtest.a myfunc.o

建立动态链接库、并不需要用到其他的工具,借助于gcc命令即可完成。此时需在命令
行中加上-K PIC和-G这两个选项,如下我们可以建立libtest的动态版本:
gcc -K PIC -G -o $HOME/lib/libtest.so myfunc.c



--

发信人: hellguard (小四), 信区: Unix
标 题: 顺便贴个生成linux动态库的
发信站: BBS 水木清华站 (Fri Nov 12 10:49:03 1999)

本来格式很好看的,但因为要贴到这里所以
扭曲了不少,见谅见谅。这里给的是linux下的例子,
但是solaris下的也差不多,如果你发现不同,就给
个详细说明出来,好不好。

ldd filename就可以看到程序用到哪些库。

ld -o OUTPUT /lib/crt0.o hello.o -lc
ld将输出最终结果文件 OUTPUT ,
用到/lib/crt0.o hello.o以及libc.a
libc.a来自标准库搜索路径,请参看-l选项的讨论

ld的选项顺序任意,可以重复,后面的将覆盖前面的。

gcc -c -fPIC linuxlib.c -O3 -o linuxlib.o
gcc -shared -Wl,-soname,liblinuxlib.so.1 \
-O3 -o liblinuxlib.so.1.0 linuxlib.o
(
ld -m elf_i386 -shared -o liblinuxlib.so.1.0 \
-soname liblinuxlib.so.1 linuxlib.o
这个语句产生的文件更小,不知道二者有何区别
-o liblinuxlib.so.1.0 这个文件名任意,关键是后面
两个符号连接要正确
当然推荐使用有意义的带版本信息的名字,包括
-soname liblinuxlib.so.1
)
ln -sf liblinuxlib.so.1.0 liblinuxlib.so.1
(
运行时,dynamic linker根据 -soname \
liblinuxlib.so.1 去寻找liblinuxlib.so.1
)
ln -sf liblinuxlib.so.1 liblinuxlib.so
(
编译的最后一个步骤,ld命令根据 -llinuxlib
选项去寻找liblinuxlib.so
)
export LD_LIBRARY_PATH=.
(
编译时、运行时都需要这个变量的存在
编译时如果不存在这个变量,编译依旧通过,但
用 ldd查看会发现没有动态连接信息
运行时如果不存在这个变量,将报告无法找到动态连接库

这个变量如果不用相对路径".",换了运行环境就比较麻烦
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
)
gcc -L. -lbsd -llinuxlib -O3 -o linuxkiller linuxkiller.c
(
-L. 指出除标准库搜索路径之外的库搜索路径,如果不指
定,将找不到liblinuxlib.so
这个选项并不能代替 LD_LIBRARY_PATH 变量,否则虽然编译通过,
但用ldd linuxkiller的时候会发现没有动态连接信息
)

可以把自己的动态连接库放到/usr/lib或者/lib下去,或者
修改/etc /ld.so.conf
然后利用/sbin/ldconfig。具体请man ldconfig

--


发信人: hellguard (小四), 信区: Unix
标 题: Re: help :static library---- what's wrong--Thanks.
发信站: BBS 水木清华站 (Thu Aug 16 14:22:39 2001)


【 在 hululu (呼噜噜~回家中) 的大作中提到: 】
: I am building a static library. But I do not know what is
: wrong. Below is a sample:
: tt.c:
: #include
: int func(){
: printf("func test\n");
: return 0;
: }
: ii.c:
: #include
: extern int func();
: ...................
★ 生成静态链接库举例

1. vi demo.h
void demo ( void );

vi demo.c
#include
#include "demo.h"
void demo ( void )
{
printf( "hello world\n" );
return;
}

2. g++ -Wstrict-prototypes -Wall -Wunused -O3 -c demo.c -o demo.o
file demo.o

3. ar -rsv libdemo.a demo.o
a - demo.o
file libdemo.a
nm -s libdemo.a
ar -tv libdemo.a
4. vi scz.c
#include
#include "demo.h"
int main ( int argc, void * argv[] )
{
demo();
return 0;
}

5. g++ scz.c -L. -ldemo -Wstrict-prototypes -Wall -Wunused -O3 -o scz
--

[转载]C语言编译全过程

编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
编译的完整过程:C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、.axf 等)


1. 编译预处理


读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理
伪指令主要包括以下四个方面:
(1)宏定义指令,如#define Name TokenString,#undef等。
对于前一个伪指令,预编译所要做的是将程序中的所有Name用 TokenString替换,但作为字符串常量的 Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif 等。
这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉
(3) 头文件包含指令,如#include "FileName"或者#include 等。
在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。
采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。
包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include 目录下。在程序中#include它们要使用尖括号(< >)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。
(4)特殊符号,预编译程序可以识别一些特殊的符号。
例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE 则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。


2. 编译、优化阶段


经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,}, +,-,*,\等等。
编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。
对于前一种优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。
后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高,也是一个重要的研究课题。
经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。


3. 汇编过程


汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
目标文件由段组成。通常一个目标文件中至少有两个段:
代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。
UNIX环境下主要有三种类型的目标文件:
(1)可重定位文件
其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据。
(2)共享的目标文件
这种文件存放了适合于在两种上下文里链接的代码和数据。
第一种是链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个 目标文件;
第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。
(3)可执行文件
它包含了一个可以被操作系统创建一个进程来执行之的文件。
汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。


4. 链接程序


由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决
的问题。
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。


总结:
C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问题时多思考、多实践。
一般情况下,我们只需要知道分成编译和连接两个阶段,编译阶段将源程序(*.c)转换成为目标代码(,一般是obj文件,至于具体过程就是上面说的那些阶段),连接阶段是把源程序转换成的目标代码(obj文件)与你程序里面调用的库函数对应的代码连接起来形成对应的可执行文件(exe文件)就可以了,其他的都需要在实践中多多体会才能有更深的理解。

C语言的文件组织结构

【以下为转载】
在C语言的应用领域,如通讯领域和嵌入式系统领域,一个的软件项目通常包含很多复杂的功能,实现这个项目不是 一个程序员单枪匹马可以胜任的,往往需要一个团队的有效合作,另外,在一个以C代码为主的完整的项目中,经常也需要加入一些其他语言的代码,例如,C代码 和汇编代码的混合使用,C文件和C++的同时使用。这些都增加了一个软件项目的复杂程度,为了提高软件质量,合理组织的各种代码和文件是非常重要的。

组织代码和文件的目的是为了使团队合作更加有效,使软件项目有良好的可扩展性、可维护性、可移植性、可裁减、可测试性,防止错误发生,提高软件的稳定性。 通常情况下,软件项目采用层次化结构和模块化开发的方法,例如,一个嵌入式软件项目可能有驱动层,操作系统层,功能层,应用程序层,每一个层使用它的下层 提供的接口,并为它的上层提供调用接口,模块则是每一个层中完成一个功能的单元,例如驱动层的每一个设备的驱动就是一个模块,应用层的每个应用程序就是一 个模块,模块使用下层提供的接口和同层其他模块提供的接口,完成特定功能,为上层和同层的其他模块提供调用接口。

这里的接口是指一个功能模块暴露出来的,提供给其他模块的访问具体功能的方法。根据C语言的特点,使用*.c文件实现模块的功能,使用*.h文件暴露单元 的接口,在*.h文件里声明外部其他模块可能是用的函数,数据类型,全局变量,类型定义,宏定义和常量定义.外部模块只需包含*.h文件就可以使用相应的 功能.当然,模块可以在细化为子模块.虽然我们这里说的接口和COM(通用组件模型)里定义的接口不同,但是,根据COM里对接口的讨论,为了使软件在修 改时,一个模块的修改不会影响到其他模块的一个模块的修改不会导致其他模块也需要修改,所以,接口第一次发布后,修改*.h文件不能导致使用这个接口的其 他模块需要重新编写.

根据C语言的特点,并借鉴一些成熟软件项目代码,总结C项目中代码文件组织的基本建议:
1,使用层次化和模块化的软件开发模型.每一个模块只能使用所在层和下一层模块提供的接口.
2,每个模块的文件包存在独立的一个文件夹中.通常情况下,实现一个模块的文件不止一个,这些相关的文件应该保存在一个文件夹中.
3,用于模块裁减的条件编译宏保存在一个独立的文件里,便于软件裁减.
4,硬件相关代码和操作系统相关代码与纯C代码相对独立保存,以便于软件移植.
5,声明和定义分开,使用*.h文件暴露模块需要提供给外部的函数,宏,类型,常量,全局变量,尽量做到模块对外部透明,用户在使用模块功能时不需要了解 具体的实现,文件一旦发布,要修改一定要很慎重,
6,文件夹和文件命名要能够反映出模块的功能.
7,正式版本和测试版本使用统一文件,使用宏控制是否产生测试输出。
8,必要的注释不可缺少。

理想的情况下,一个可执行的模块提供一个公开的接口,即使用一个*.h文件暴露接口,但是,有时候,一个模块需要提供不止一个接口,这时,就要为每个定义 的接口提供一个公开的接口。在C语言的里,每个C文件是一个模块,头文件为使用这个模块的用户提供接口,用户只要包含相应的头文件就可以使用在这个头文件 中暴露的接口。所有的头文件都建议参考以下的规则:

1, 头文件中不能有可执行代码,也不能有数据的定义,只能有宏、类型(typedef,struct,union,menu),数据和函数的声明。例如以下的 代码可以包含在头文件里:
#define NAMESTRING “name”
typedef unsign long word;
menu{
flag1;
flag2;
};
typedef struct{
int x;
int y;
} Piont;
extent Fun(void);
extent int a;
全局变量和函数的定义不能出现在*.h文件里。例如下面的代码不能包含在头文件:
int a;
void Fun1(void)
{
a++;
}

2,头文件中不能包本地数据(模块自己使用的数据或函数,不被其他模块使用)。这一点相当于面向对象程序设计里的私有成员,即只有模块自己使用的函数,数 据,不要用extent在头文件里声明,只有模块自己使用的宏,常量,类型也不要在头文件里声明,应该在自己的*.c文件里声明。
3,含一些需要使用的声明。在头文件里声明外部需要使用的数据,函数,宏,类型。
4,防止被重复包含。使用下面的宏防止一个头文件被重复包含。
#ifndef MY_INCLUDE_H
#define MY_INCLUDE_H
<头文件内容>
#endif
5,包含extern "C",使的程序可以在C++编译器被编译
#ifdef __cplusplus
extern "C"{
#endif
<函数声明>
#ifdef __cplusplus
}
#enfif
  被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;未加extern “C”声明时的编译方式,作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例 如,假设某个函数的原型为:
void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函 数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。 同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写 程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这 个名字与用户程序中同名的全局变量名字不同。加extern "C"声明后的编译和连接,强制C++连接器按照C编译器产生的符号_foo链接。
6,保证在使用这个头文件时,用户不用再包含使用此头文件的其他前提头文件,即要使用的头文件已经包含在此头文件里。例如:area.h头文件包含了面积 相关的操作,要使用这个头文件不需同时包含了关于点操作的头文件piont.h。用户在使用area.h时不需要手动包含piont.h,因为我们已经在 area.h中用#include “point.h”包含了这个头文件。

有一些头文件是为用户提供调用接口,这种头文件中声明了模块中需要给其他模块使用的函数和数据,鉴于软件质量上的考虑,处理参考以上的规则,用来暴露接口 的头文件还需要参考更多的规则:
1,一个模块一个接口,不能几个模块用一个接口。
2,文件名为和实现模块的c文件相同。abc.c--abc.h
3,尽量不要使用extern来声明一些共享的数据。因为这种做法是不安全的,外部其他模块的用户可能不能完全理解这些变量的含义,最好提供函数访问这些 变量。
4,尽量避免包含其他的头文件,除非这些头文件是独立存在的。这一点的意思是,在作为接口的头文件中,尽量不要包含其他模块的那些暴露*.C文件中内容的 头文件,但是可以包好一些不是用来暴露接口的头文件。
5,不要包含那些只有在可执行文件中才使用的头文件,这些头文件应该在*.c文件中包含。这一点如同上一点,为了提高接口的独立性和透明度。
6,接口文件要有面向用户的充足的注释。从应用角度描述个暴露的内容。
7,接口文件在发布后尽量避免修改,即使修改也要保证不影响用户程序。

多个代码文件使用一个接口文件:这种头文件用于那些认为一个模块使用一个文件太大的情况。对于这种情况对于这种情况在参考上述建议后,也要参考以下建 议。
1,多个代码文件组成的一个模块只有一个接口文件。因为这些文件完成的是一个模块。
2,使用模块下文件命名<系统名><模块名命名>
3,不要滥用这种文件。
4,有时候也会出现几个*.c文件用于共向数据的*.h文件,这种文件的特点是在一个*.c文件里定义全局变量,而在其他*.c文件里使用,要将这种文件 和用于暴露模块接口的文件区别。
5,一个模块如果有几个子模块,可以用一个*.h文件暴露接口,在这个文件里用#include包含每个子模块的接口文件。

还有一种头文件,说明性头文件,这种头文件不需要有一个对应的代码文件,在这种文件里大多包含了大量的宏定义,没有暴露的数据变量和函数。这些文件给出以 下建议:
1,包含一些需要的概念性的东西.
2,命名方式,定义的功能.h
3,不包含任何其他的头文件.
4,不定义任何类型.
5,不包含任何数据和函数声明.

上面介绍了C头文件的一些建议,下面介绍C代码文件*.c文件的一些建议,*.c文件是C语言中生成汇编代码和机器码的内容,要注意以下建议:
1.命名方式 模块名.c
2,用static修饰本地的数据和函数。
3,不要使用external。这是在*.h中使用的,可以被包含进来。
4,无论什么时候定义内部的对象,确保独立与其他执行文件。
5,这个文件里必须包含相应功能函数。

上面介绍了一些C文件组织的建议,用于提高C语言项目的质量,在以后的C项目组织中,学习面向对象和COM的思想,将这些思想加入到C程序中,能够写出更 高质量的代码。上面的建议在具体的项目里应该灵活运用,附录里有*.h头文件和*.c代码文件的模版,在工程中可以作为参考。另外,C工程中经常有一些汇 编代码文件,这些文件也要使有*.h头文件暴露其中的数据和函数,以便其他*.c文件包含使用。