Objective-C:GCC+GNUstep配置

来源:互联网 发布:artcam二维编程 编辑:程序博客网 时间:2024/05/21 10:48

此贴转自: http://elton.javaeye.com/blog/344899,不过他好像也是转自别的网站

 

 

俗话说,“工欲善其事,必先利其器”,所以学习Objective-C的第一件事就是配置Objective-C下面的开发环境。有苹果机的幸福在于,可以很方便的在XCode下面写Objective-C的程序。可惜的是不能整天带着我的大熊猫到处跑,所以也有必要在windows系统下面配置一个环境方便学习。我们都是被IDE惯坏的孩子,本以为可以很方便做的事情(我是说配置环境),没想到居然花了两天时间来琢磨怎么搞这个事情那个,顺便又复习了一C语言的编译过程。

安装

在windows下面想要安装一个GNUstep的环境其实是很简单的一件事情。不过说实话,GNUstep.org上面的文档还真的是很乱。我为此还安装了Cygwin和MinGW。事实上这些都不用安装,只需要在这里 找到windows installer 就可以了。下载下来的文件有两个,一个是GNUstep System,其实就是MinGW和MSYS,一个是GNUstep Core,这才是我们需要GNUstep相关的东西。安装很简单,就是windows下面的标准安装程序。装完后,在开始菜单里面,有一个GNUstep 的菜单,点击shell就可以进入MSYS交互环境了。

第一个程序

先让我们来点有成就感的事情。新建一个文件main.m

> vim main.m

(在你的GNUstep安装目录下面的home/<username>文件夹里面,比如我的是C:/GNUstep/home/stelee/ 就会生成一个main.m文件)

添加如下内容

Objective-c代码 复制代码
  1. #import <stdio.h>   
  2.     int main(int argc,const char *argv[]){   
  3.     printf(”hello world/n”);   
  4.     return 0;   
  5. }  

 

 

然后运行gcc main.m

你就会发现在同一个目录下面有一个a.exe

在shell环境下执行 ./a.exe就可以看到正确的输出了。是不是很简单?基本上来说,这个第一个文件虽然是以m结尾的,但是确是一个标准的C语言程序,所以我们可以没有任何障碍的编译执行。那么一个“真正”意义上的objective-c程序呢?

给你一点挫折

我们修改一下main.m程序

Objective-c代码 复制代码
  1. #import <Foundation/Foundation.h>   
  2.   
  3. int main(int argc, char**argv)   
  4.   
  5. {   
  6.   
  7. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];   
  8.   
  9. NSLog(@”headfile dir is ok/n”);   
  10.   
  11. [pool release];   
  12.   
  13. return 0;   
  14.   
  15. }  

 

这个程序我们使用了Objective-C的Foundation库。再执行

gcc main.m

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

Step by step慢慢解决

好像是库文件找不到。这个没问题,我们添加一个库文件,同时我们分开执行编译和链接,看看都发生了什么事情

gcc -c main.m -I /GNUstep/System/Library/Headers

main.m:11: error: cannot find interface declaration for `NXConstantString’

在代码中,我们使用了@”headfile dir is ok/n”,看来需要为编译器制定默认的Constant String类型,别忘了,这是C语言嘛

Shell代码 复制代码
  1. gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers  

 

 

好像编译成功了,我们的目录下面有一个main.o文件。

下面链接这个文件

gcc -o main main.o

main.o:main.m:(.text+0×33): undefined reference to `objc_get_class’
main.o:main.m:(.text+0×45): undefined reference to `objc_msg_lookup’
main.o:main.m:(.text+0×64): undefined reference to `objc_msg_lookup’
main.o:main.m:(.text+0×80): undefined reference to `NSLog’
main.o:main.m:(.text+0×93): undefined reference to `objc_msg_lookup’
main.o:main.m:(.text+0xbc): undefined reference to `__objc_exec_class’
main.o:main.m:(.data+0×74): undefined reference to `__objc_class_name_NSAutorele
asePool’
main.o:main.m:(.data+0×78): undefined reference to `__objc_class_name_NSConstant
String’
collect2: ld returned 1 exit status

光有头文件,没有执行的链接库怎么行呢,于是我们得到了最终的命令:

Shell代码 复制代码
  1. gcc -o main main.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base  

 

最终得到了我们想要的main.exe

赶紧执行一下./main.exe看看效果吧

在后续的文章中我将介绍怎么写makefile和怎么使用ruby来构建自动化编译过程。不过现在我可以快速的开始我的objective-c的学习了!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 尚方宝剑弄丢了怎么办 九五出款被黑18w怎么办 很容易感动伤感哭怎么办 为什么安卓版ps打不开怎么办 遇见职业打假人怎么办 打假投诉极限次怎么办 导师无故留学生要怎么办 孩子24了不争气怎么办 退休工资卡遗失怎么办大同市 天津体育惠民卡怎么办 高跟鞋走路太响怎么办 高跟鞋太响怎么办妙招 穿高跟鞋想开车怎么办 脚瘦穿高跟鞋容易掉怎么办 dq11时装卖了怎么办 廉洁教育手抄报怎么办 做美发口才不好怎么办 月嫂怎么办澳大利亚签证 高一学生叛逆怎么办 和异性说话紧张怎么办 幼儿教师模拟讲课紧张怎么办 静不下心来怎么办 失眠焦虑到极点怎么办 老师罚学生买东西怎么办 大学每晚查寝怎么办 教育机构会计账怎么办 车陂扣12分的话怎么办 公选课挂科怎么办 颈椎疼带头疼怎么办 本科出身不好该怎么办 科研经历不丰富怎么办 拍电影需要一些公共场所怎么办 录屏没有声音怎么办 超星课程里阅读怎么办 微信自动冻结怎么办 微信银行卡冻结怎么办 微信封号了怎么办 微信号冻结不了怎么办 微店没收到货怎么办 系统确认收货了怎么办 ppt加载项没有怎么办