【在主画面加入捷径】
       
【选择语系】
繁中 简中

[Objective-C] 程序设计教学:在 GNU/Linux 平台上以 GNUstep 建立开发 Objective-C 程序的开发环境

【赞助商连结】

    前言

    苹果公司 (Apple Inc.) 没有将 Cocca 框架放到其他平台上,日后应该也不会放。若想要在 GNU/Linux 上练习 Objective-C,可以用 GNUstep,这是一个 Cocca 的自由软件再制版本。主流的 GNU/Linux 应该都会提供预编好的 GNUstep 套件,但也可以自行从源代码来编译;我们两种方法都会介绍,并且比较其差异。

    一般的方法,使用现有的 GNUstep 套件

    有一些主流 GNU/Linux 发行版会提供预编好的 GNUstep 套件,直接安装这些套件是最简单的方式。在 Ubuntu 或 Debian 上可用以下指令安装:

    $ sudo apt-get install gnustep-devel
    

    至于 CentOS 则没有提供现有的套件,可参考下文中有关从源代码编译的章节来编译及安装 GNUstep;经笔者实测,CentOS 缺一些相依函式库,需较多手工才能完成整个编译过程。

    选择适用于 GNUstep 的编辑器 (editor) 或整合式开发环境 (IDE)

    由于 Objective-C 的主流平台是 Mac,在 GNU/Linux 并没有什么大型 IDE 可用。AtomVSCode 对 Objective-C 有语法高亮 (syntax highlighting) 等基本支援。EditRocket 是一个多语言商业编辑器,可试用 30 天后再买,有兴趣的读者可自行试用。

    撰写 GNUstep 版本的 Hello World 程序

    Hello World 程序是用来确认开发环境可正常运作,一开始不用急着了解程序的语义。本节建立一个 Objective-C 版本的 Hello World 程序。

    用编辑器或 IDE 建立新的文件 *hello.m*,加入以下内容:

    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[])
    {
        @autoreleasepool {
            NSLog(@"Hello World");
        }
    
        return 0;
    }
    

    现阶段 Hello World 程序的用途是确认开发环境可正常运作,暂时不用纠结在语法细节上,我们会于后文介绍其语法。

    撰写 hello.m 后,使用以下指令来编译及执进程式:

    $ gcc -o hello hello.m -lobjc -lgnustep-base -I /usr/include/GNUstep -L /usr/lib/GNUstep/Libraries -fconstant-string-class=NSConstantString
    

    由于 GNUstep 不是位于 GCC 的标准路径上,所以我们要以 -I 指定头文字档 (header) 的位置,以及 -L 指定二进位函式库的位置。不同发行版的 GNUstep 安装位罝可能有差异,要根据实际的位置修改相关的路径。

    读者一定会觉得这个指令很长,每次都要逐字打相当繁琐。GNUstep 提供 GNUstep Make,这是一套以 Makefile 为基础的项目设定框架,用来简化编译 Objective-C 程序的过程,我们将于后文介绍这个软件。

    另外,由于 NSLog 是用于纪录档 (log) 的函式,故会跑时间戳记 (time stamp) 出来,和传统上 C 语言的 printf函数略有不同。

    替代的方法,自行从源代码编译及安装 GNUstep

    使用现有的 GNUstep 套件相当简单,但这些套件所提供的 GNUstep 可能版本较旧,若想要使用较新版本的 GNUstep,可以试着自行编译;另外,有些 GNU/Linux 发行版没有现成的 GNUstep 套件,这时候也可以试着自己编译。我们以 Ubuntu 为例,展示编译及安装 GNUstep 的过程。

    建立一个目录 (directory),因为我们会抓数个子项目。参考以下指令:

    $ mkdir gnustep
    $ cd gnustep
    

    接下来的操作,都会在此工作目录下。

    用 Git 下载以下子项目:

    $ git clone https://github.com/gnustep/tools-make
    $ git clone https://github.com/cwchentw/libs-base.git
    $ git clone https://github.com/gnustep/libs-gui
    $ git clone https://github.com/gnustep/libs-back
    $ git clone https://github.com/gnustep/plugins-session.git
    $ git clone https://github.com/cwchentw/tools-scripts.git
    

    在这五个项目中,前四个项目是 GNUstep 实际的函式库和工具软件,第五个项目是一些设定档,而第六个项目则是一些跑编译及安装 GNUstep 的脚本。眼尖的读者会发现其中几个项目的来源不是 GNUstep 上游,而是笔者 fork 出来的版本,因为这些 fork 出来的项目是笔者实际修改及安装的版本,目前还没有被 GNUstep 开发团队接受。

    在 Ubuntu (或 Debian) 上透过以下指令安装相依套件:

    $ sudo ./tools-scripts/install-dependencies
    

    如果读者使用其他发行版的话,目前 GNUstep 开发团队没有释放等效的脚本,需参考这个脚本自行手动安装相依套件。

    重新回到 gnustep 目录的根目录,输入以下指令:

    $ ./tools-scripts/compile-all
    

    如果顺利的话,这个指令会使用 GCC 编译器,依序将 GNUstep 的四个子项目编译并安装到 /usr/GNUstep 目录上。

    如果发生错误的话,就不要一直重试了;错误原因没有排除的话,仍然会发生错误,不会自动修好。这时候建议将 tools-scripts/compile-all 内的指令逐一贴到终端机上,慢慢看是那个环节发生了问题。如果错误成因在 GNUstep 子项目本身的话,可以将该项目 fork 一份,进行修改后发出 PR (pull request),若被 GNUstep 开发团队接受的话,代表读者也替 GNUstep 项目尽了一些心力。

    小结

    在本文中,我们为读者介绍了两种在 GNU/Linux 平台上建立 GNUstep 开发环境的方式。一般来说,使用现有的 GNUstep 套件可以很快建置 Objective-C 开发环境;必要时,仍然可以自行从源代码编译和安装。类 Unix 系统在设计时,主要是以 C 语言为考量,相对来说,GNUstep 编译环境有可能不是放置在标准位置上;着眼于 GNUstep 程序代码编译的问题,GNUstep Make 是一套用来简化 Objective-C 项目的编译过程的设定档,我们将于后文介绍。

    【赞助商连结】