• Windows 下使用 GNUstep 编译并运行 Objective-C 程序


    今晚上开始看《Objective-C 程序设计(第4版)》这本书(OSChina 正在做此书的书评活动,详情请看这里),到现在为止看到第 7 章,于是想动手试试写两简单的程序编译跑跑看。

    不习惯 Mac,在 Windows 下装了个 GNUstep 也可以玩。

    非常简单的几步,你也来试试吧?

    1. 下载并安装 GNUstep

    下载地址:http://ftpmain.gnustep.org/pub/gnustep/binaries/windows/

    有三个文件是必须安装的,分别是:

    这里我下载的都是最新的版本,按默认方式将上面三个程序都安装在同一个目录,我用的是 D:GNUstep 目录。

    安装完毕后,打开:开始菜单 -> 所有程序 -> GNUstep -> Shell  就会进入一个类似 Linux 的 Shell 环境,如下图所示:

    你可以自行一些简单的 Linux 命令,例如 ls、mkdir 等。

    下面我们进入 /home 目录,然后创建一个 app1 的子目录:

    1
    2
    3
    cd /home
    mkdir app1
    cd app1
    这个 app1 的目录位于磁盘上的 D:GNUstepmsys1.0homeapp1 目录下。

    接下来我们写一个简单的程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #import <Foundation/Foundation.h>
     
    int main (int argc, const char *argv[]) {
        //@autoreleasepool {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSLog(@"Hello oschina");
        [pool drain];
        //}
        return 0;
    }
    说明:由于 GNUstep 带的 gcc 编译器不支持 Objective-C 2.0 ,因此不支持 @autoreleasepool 这个指令,我将它注释掉了。

    然后我们用下面的命令来编译这个程序:

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

    上面这个命令除了 -o 后面的参数你可以更改,其他都必须照写,否则就会出错。

    参数说明,如果熟悉Linux/Unix下C/C++编译的话,上述参数应该很熟悉,-I表示头文件查找的路径,-L表示库文件查找 路径,-l表示需要链接的库文件。但是,-fconstant-string-class=NSConstantString  对于这个参数可能比较陌生,这个参数主要是指定常量字符串所使用的class。

    编译完就会在当前目录生成一个名为 app1.exe 的可执行程序。

    输入 ./app1.exe 命令执行这个程序,执行结果:

    2012-11-21 22:04:46.911 app1[4780] Hello oschina

    就这么简单!至于代码中每一行的意思大家自己看书吧。

    再来一个复杂一点的程序 app2,app2 包含三个文件,分别是:

    Main.m:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #import "Calculate.h"
     
    int main(int argc, char *argv[])
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        Calculate *cal = [[Calculate alloc] init];
        int v = 5;
        int av = 10;
        [cal setNum: v];
        [cal add: av];
        NSLog(@"%i + %i = %i ", v, av, [cal num]);
        [pool drain];
        return 0;
    }
    Calculate.h:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //Calculate.h
    #import <Foundation/Foundation.h>
     
    @interface Calculate : NSObject
    {
        @private int num;
    }
     
    -(int) num;
     
    -(void) setNum: (int) n;
     
    -(void) add: (int) n;
     
    @end
    Calculate.m:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #import "Calculate.h"
     
    @implementation Calculate
     
    -(int) num
    {
        return num;
    }
     
    -(void) setNum: (int) n
    {
        num = n;
    }
     
    -(void) add: (int) n
    {
        num += n;
    }
     
    @end
    编译方法更上面一样,只不过需要将两个 .m 文件都加进去:
    1
    $ gcc -o app2 Main.m Calculate.m -I/GNUstep/System/Library/Headers -fconstant-string-class=NSConstantString -L/GNUstep/System/Library/Libraries -lobjc -lgnustep-base

    运行结果: 2012-11-21 22:17:51.207 app2[3144] 5 + 10 = 15

    现在的问题是:有没有办法让 GNUstep 支持 Objective-C 2.0 呢?官网上有描述这个问题,需要使用Clang 编译器,不知道如何搞定!

     
     
     

    Windows系统中使用GNUstep 编译运行Objective-C程序

      (2011-03-07 20:18:09)
    标签: 

    it

     

    首先要说明的是:

    GNUStep 虽然可以在windows上安装使用但主要还是是面向Linux用户,而非Windows用户。如果有比较好的Linux开发经验,用GNUStep还是不错的。GNUStep的功能并不强,而且只有Foundation库,因此建议大家还是多花时间在 XCode 上比较划算的!

     

    最近学习Objective-C,但是很穷用不起XCode。于是打算用GNUstep环境,命令行编译运行Objective-C文件。但是找了一些网上的教程,比较老了,而且都是相互copy。有些错误的地方都是传来传去。于是打算简单写一下正确的步骤。如果您有更好更简单更正确的方法,也请您留言,我将学习并改正。谢谢!

    首先去http://www.gnustep.org/experience/Windows.html官网下载GNUstep的三件套。很多文章都是写的下载两个程序,其实现在GCC在第三个文件里了。仅仅前两个是不行的。

    分别是GNUstep MSYS System、GNUstep Core、GNUstep Devel这三个工具。

    下载好后安装,一路点击下去就可以了。

    然后就可以使用了。程序->GNUstep->Shell。打开后等2秒就可以使用了。

    给个例子吧:例如在F盘目录下用文本编辑一个文件Fraction.m,代码如下(最简单的Obj-C程序):

     

    #import <Foundation/Foundation.h>  

    int main(int argc, char *argv[])  {  

      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  

      NSLog(@"Hello world!");  

      [pool drain];  

      return 0;  

    }  

     

    首先在Shell输入 cd f: 切换到F盘目录,然后

    在Shell中输入命令:gcc -fconstant-string-class=NSConstantString -c Fraction.m -I /GNUstep/System/Library/Headers

    这是目录里就会生成一个Fraction.o文件。(成功完成此步骤不会有任何显示在命令行中,若有显示说明有错误)

    接下来输入命令gcc -o Fraction Fraction.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base

    此时成功的话就会在目录里生成一个Fraction.exe文件。

    最后使用命令 ./Fraction.exe会看到输出的结果,我的结果是:2011-03-07 19:30:33.078 Fraction[4824] Hello world!

    成功!

     

  • 相关阅读:
    报错:Table 'sell.hibernate_sequence' doesn't exist
    “可恶”的mariadb
    日志的使用
    微信小程序开发步骤简述
    我对同步异步阻塞和非阻塞的简单理解
    dubbo+zookeeper搭建时报错java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy
    在CentOS7中安装zookeeper
    markdown 显示图片的三种方式
    Spring Data JPA 提供的各种Repository接口作用
    windows nginx 搭建文件服务器(通俗易懂)
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4935544.html
Copyright © 2020-2023  润新知