- ベストアンサー
Objective-cでNSLogが使えない
- Objective-cのNSLogで標準出力に出力したいのですが、うまくいきません。
- Ubuntu 10.04.1 LTSでObjective-cのNSLogを使用している際に、Segmentation faultのエラーが発生します。
- Gnustepライブラリとリンクしているはずなので、原因の特定が困難です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「GNUstep」で、ネット検索してみると、下記のリンクがヒットしました。 http://www.moonmile.net/blog/archives/595 NSLogが使えているようです。 <Foundation/NSObject.h>をインポートしてみてはどうでしょう?
その他の回答 (1)
- harawo
- ベストアンサー率58% (3742/6450)
NSで始まる関数名、クラス名は、AppleのCocoaフレームワークで定義されているものですから、Mac OS X上の開発環境、Xcode以外には実装されていないのでしょう。 Mac OS Xは、NEXT社のOpenStepを前身としていて、そのOpenStepは、NextStepを前身としていました。NSはNextStepで実装したフレームワークであることを意味しています。 なので、NextStepから分派したObjective-Cなら、NSLogが実装されているかもしれませんが、その前の段階で分派したObjective-Cなら実装していないでしょう。 Objective-Cは、C言語をそのまま記述できるので、標準出力は、printfを使えます。 文字列の頭に@がついているものは、NSStringの文字列であることを意味します。Cの文字列はただ「"~"」と記述します。なので、「NSLog("Hello, World!")」だと、使える可能性はありますね。 UbuntuでObjective-Cを使おうとする理由が、理解できませんが、興味本位以外の動機があるのでしたら、Macintoshを購入することをお勧めします。Xcodeが標準で付属しますし、Appleのサイトから最新バージョンを無料でダウンロードできます(要無料会員登録)。 http://snap.sonydeveloper.com/ ひょっとして、これでしょうか?
お礼
NSlogが未実装ならコンパイルエラーになるような気がするんですが、 エラーにはならないことに何か理由があるのでしょうか? C言語であれば、少なくともリンカエラーですよね。 ちなみにNSlogをやめてNSstringで NSString *str = [[NSString alloc] initWithString:@"123"]; printf("%s\n", [str UTF8String]); とやってもUTF8Stringメッセージがエラーです。 しかしながら、 printf("%d\n", [str length]); は正常動作します。 部分的に動いてる?? あと、NSLog("Hello, World!")はエラーでした。 > なので、NextStepから分派したObjective-Cなら、NSLogが実装されているかもしれませんが、その前の段階で分派したObjective-Cなら実装していないでしょう。 私の環境はたぶんGnuStepです。 よって、GnuStepで実装があるNS系関数が使えるということですよね。 http://wiki.gnustep.org/index.php/NSString ここでNSlogも使用されてます。 やはりサポートされていると思います。 …ということは、何らかの理由で正しいGnuStepライブラリがインストールできてないか、 インストールできてるけどリンクできてないって感じですかね。 > UbuntuでObjective-Cを使おうとする理由が、理解できませんが、興味本位以外の動機があるのでしたら、Macintoshを購入することをお勧めします。 実は今夏に購入しました。 それでXcodeでiPhoneアプリの実装やってたんですけど、どうにも開発環境に馴染めないので クラス開発は使い慣れたUbuntu+vi+gdbで行いたいのです。 それなら自宅でも会社でも開発できますしね。 C言語と違って、言語仕様で決められた関数とかヘッダファイルが 何なのか良く分からないんですよね。たぶん言語仕様では ほとんど規定してないので、NextStep時代の標準的なクラスが 実質Objective-cの標準クラスという感じではないかと予想しているんですが。 > ひょっとして、これでしょうか? それじゃないです。それじゃないですけど、面白そうな話ですね。 知りませんでした。 しかも結構ホットな話題なようで。 GnuStepに詳しくなっとくと、こっちも楽しめそうですね。 ありがとうございます。
お礼
ご指摘のインポートでは変化はありませんでした。 教えていただいたサイトはgcc使ってるようなので、同じようにgccでもやってみましたが やはりエラーでした。 $ gcc -lobjc -lgnustep-base -I/usr/include/GNUstep -I/usr/lib/gcc/i486-linux-gnu/4.4/include -g -Wall oshiete.m -o oshiete oshiete.m: In function ‘main’: oshiete.m:7: error: cannot find interface declaration for ‘NXConstantString’ どうも@を使った書き方が気に入らないようです。そこで、@でNSstringのインスタンスを 作らずに、明示的に作る方法でやってみたところ、ログ出力が得られました! NSString *str = [[NSString alloc] initWithUTF8String:"Hello World."]; NSLog(str); // <- この方法だとOK コンパイラをclangに変更しても警告1つで動作自体はOKでした。 では、なぜ@がいけないのか。 ソースはUTF8で作成しているのですが…。 NSLog自体は動作したので、@が使えない問題を改めて質問してみることにします。 ありがとうございました。