Hello World
Hello Worldのソースコード
以下のコードをhello.mとして保存します。 Objective-Cのソースファイルは拡張子を「.m」とするのが通例となっているのでそれに習います。
#include <Foundation/Foundation.h>
int main(void)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Hello, world!");
[pool release];
return 0;
}
これが最小のObjective-C+GNUstepのコードというわけではありませんが、十分に短く、かつ、GNUstepの環境が整っていなければビルドできないので、テスト素材としてはちょうどよいです。
コンパイル
コンパイルとリンクを同時に行うことももちろん可能ですが、ここではわかりやすさのために分けて実行することにします。
gccでコンパイルだけを行うには、-c
オプションをつけて実行します。
$ gcc -c source.m $(gnustep-config --objc-flags)
問題がなければ、オブジェクトファイルが生成されます。
$ ls hello.d hello.m hello.o
拡張子が「.d」のhello.dは依存するヘッダファイルをMakeが認識するフォーマットでダンプされたものです。
このファイルはgccに-MMD
オプションが与えられた場合に生成されます。
ここで、gnustep-configというツールを利用していることに注目します。
gnustep-config –objc-flags
というコマンドを単独で実行すると、コンパイルに必要なフラグが出力されます。
$ gnustep-config --objc-flags -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -O2 -fconstant-string-class=NSConstantString -I. -I/home/freemikan/GNUstep/Library/Headers -I/usr/local/include/GNUstep -I/usr/include/GNUstep
この出力をgccのオプションとして利用するために、シェルのコマンド置き換えの機能を利用しています。
$(…)
の代わりにバッククォート `…`
にすることもできます。
$ gcc -c source.m `gnustep-config --objc-flags`
リンク
リンクもやはりgnustep-configの助けが必要になります。
$ gcc -o hello hello.o $(gnustep-config --base-libs)
GNUstepの環境に問題がなければ、gccに-o hello
と指定したので、helloという名前の実行可能バイナリファイルが生成されているはずです。
$ ls hello hello.d hello.m hello.o
確かに実行可能バイナリファイルhelloが生成されています。 これを実行してみます。
$ ./hello 2025-05-20 21:43:34.036 hello[20105:20105] Hello, world!
「Hello, world!」の出力を確認することできました。 これで最初の目標は達成です。
$ gcc -o hello $(gnustep-config --base-libs) hello.o
--objc-libs
というものもあります。
しかし、今回はこれを使いません(使えません)。
gnustep-config --base-libs
の出力には、-lgnustep-base
が含まれていて、まさにそれが必要だからです。
Objective-CとGNUstepの関係について
Objective-Cはもちろんプログラミング言語ですが、言語単独では極めて使い勝手が悪いです。 C言語のスーパーセットである(つまり、C言語として使うことができる)ことを除けば、ほとんど何もできないといってもいいくらいです。 AppleのObjective-Cによるプログラミングを支えるのはFoundationフレームワークとCocoaフレームワークであり、切り離すことは困難です。 GNUstepはFoundationフレームワーク及びCocoaフレームワークの代替となります。 LinuxでObjective-Cのプログラミングをする場合、GNUstep抜きではかなり厳しいのが現実です。 Objective-CとGNUstepが協調して初めて快適なプログラミング環境になります。