俗话说,“工欲善其事,必先利其器”,所以学习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. }
#import <stdio.h>int main(int argc,const char *argv[]){printf(”hello world\n”);return 0;
}

然后运行gcc main.m

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

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

给你一点挫折

我们修改一下main.m程序

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

这个程序我们使用了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
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
gcc -o main main.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base

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

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

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

转载于:https://blog.51cto.com/no001/509758

Objective-C:GCC+GNUstep配置相关推荐

  1. 【编译器】Mac下gcc环境配置折腾

    Mac下gcc环境配置折腾 1. 在Terminal键入g++提示自动安装 gcc:Terminal键入g++,来自x-code的gcc工具clang,默认版本4.2.1 Command Line T ...

  2. gcc环境配置时遇到的问题

    下载gcc时遇到的问题 今天在学习树莓派配置gcc环境时,当下载完gcc-4.1.2.tar.bz2版本后,按照网上的步骤解压缩一直不成功,一直出现 gzip: stdin: not in gzip ...

  3. RocksCluster上Fluka编译环境gcc/gfortran配置

    本次服务器安装过程,首先使用网络教程使用devtoolset的方法将gcc安装在/opt/rh/devtoolset-9/root/usr/bin/gcc下.但是鉴于服务器节点机在允许fluka的so ...

  4. java是否支持freertos_使用GCC配置FreeRTOS(ARM)

    我是RTOS和ARM Cortex MCU的新手 . 我需要使用带有STM32L053核板的FreeRTOS GCC mbed.org库 . 我已经使用GCC mbed qt-creator成功创建了 ...

  5. 【Linux 操作系统】阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...

  6. 最近在 vscode 中借助 gcc 编译器来配置 c

    最近在 vscode 中借助 gcc 编译器来配置 c 语言开发环境时,发现中文编码存在乱码问题.再加上最近学习到多字节字符与宽字符,搅在一起,搞得很乱,就把自己的理解写下来,供有需者参考吧. 1. ...

  7. GCC 中文手册 - 摘自纯C论坛

    GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g++-GNU工程的C和C+ ...

  8. gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)

    总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...

  9. gcc g++ 参数介绍

    C和C++ 编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理 (preprocessing),编译(compilation),汇编(assembly)和连接(linking).源 ...

最新文章

  1. php 分页类使用,php 分页类
  2. FLEX RSL 部署产生的问题
  3. c# 对COM+对象反射调用时地址参数处理 c# 对COM+对象反射调用时地址参数处理
  4. pycharm 开发app_windows及mac下开发Excel, python+xlwings开发环境配置
  5. 算法系列之图--DFS
  6. Mac下svn搭建和使用方法
  7. 【OpenCv】cvWaitKey获取键盘值
  8. java qq机器人_简单几步教你如何用Java快速制作一个QQ机器人
  9. mybatis批量更新报错问题解决
  10. tbopen链接生成工具_愚人节必备工具,有了它们就是朋友圈最靓的仔
  11. 服务器CPU使用率过高排查与解决思路
  12. 【知识笔记】Debugging
  13. 高通量数据中批次效应的鉴定和处理 - 系列总结和更新
  14. 搞算法的仙女妹子,爱了!!
  15. python图片转文字
  16. windows下gromacs中文教程(simulate chain A of insulin (PDB ID: 1ZNI).
  17. linux 文件-s,linux下文件的特殊权限s和t
  18. 可达性分析算法-针对的对象
  19. 银屑病推荐益生菌摄入(持续更新中)
  20. codewars--js--Pete, the baker

热门文章

  1. java多张图片合成一张_OLIS 多张图片合成分享
  2. ARP扫描工具arp-scan
  3. stm32 温湿度_基于STM32单片机大棚温湿度检测无线蓝牙APP控制设计
  4. 计算机游戏与动漫设计大赛,我院获第10届中国大学生计算机设计大赛 数字媒体设计类动漫游戏组一等奖...
  5. 好东西+php,推荐个好东西swoole,php如虎添翼
  6. 借助液态金属传感器和AI,这次机械手可能真的找到感觉了
  7. 用于视力恢复的脑机接口综述(一)(修改)
  8. iOS11正式推出,第一批AR应用上线App Store!
  9. DokiCam 360°4K相机:为极致运动爱好者而生
  10. 特斯拉纯视觉FSD版本Bug频发!马斯克:不认真测试的车主就取消资格