Objective-cでNSLogが使えない

このQ&Aのポイント
  • Objective-cのNSLogで標準出力に出力したいのですが、うまくいきません。
  • Ubuntu 10.04.1 LTSでObjective-cのNSLogを使用している際に、Segmentation faultのエラーが発生します。
  • Gnustepライブラリとリンクしているはずなので、原因の特定が困難です。
回答を見る
  • ベストアンサー

Objective-cでNSLogが使えない

Objective-cのNSLogで標準出力に出力したいのですが、 どうにもうまくいきません。 ソース $ cat oshiete.m #import <Foundation/Foundation.h> int main(int argc,const char * argv[]) {   NSLog(@"Hello World!");   return 0; } コンパイル $ clang -lgnustep-base -lobjc -I/usr/include/GNUstep -I/usr/lib/gcc/i486-linux-gnu/4.4/include -g -Wall oshiete.m -o oshiete 実行 $ ./oshiete Segmentation fault OSはUbuntu 10.04.1 LTSで、コンパイラはclangを使用しています。 gdbでステップ実行すると、NSLog実行時に以下のエラーが得られました。 Program received signal SIGSEGV, Segmentation fault. 0xb7c52e46 in __objc_get_forward_imp () from /usr/lib/libobjc.so.2 Objective-cが良く理解できてないのですが、Gnustepライブラリとリンクして 動作しているはずなので、そこの動きがよくない?? コンパイルでのエラーや警告は0件です。 自力での解決が困難です。 どなたかお力添えをお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

「GNUstep」で、ネット検索してみると、下記のリンクがヒットしました。 http://www.moonmile.net/blog/archives/595 NSLogが使えているようです。 <Foundation/NSObject.h>をインポートしてみてはどうでしょう?

jjk65536
質問者

お礼

ご指摘のインポートでは変化はありませんでした。 教えていただいたサイトは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自体は動作したので、@が使えない問題を改めて質問してみることにします。 ありがとうございました。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

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/ ひょっとして、これでしょうか?

jjk65536
質問者

お礼

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に詳しくなっとくと、こっちも楽しめそうですね。 ありがとうございます。

関連するQ&A

  • Objective-cで@"Foo"が使えない

    http://okwave.jp/qa/q6406418.htmlでNSLogが使えないと質問したものです。 結局NSLog(@"Foo")のうち@部分に問題があったので、質問を改めさせていただきました。 Ubuntu10.04+clang+gnustep環境で、@を使ってNSStringインスタンスを生成しようとすると エラーになります。 例:NSString *str = @"Foo"; // <- error! 例:NSLog(@"Foo"); // <- error! コンパイルではエラーが出ず、実行時にエラーになります。 $ clang -lobjc -lgnustep-base -I/usr/include/GNUstep -I/usr/lib/gcc/i486-linux-gnu/4.4/include -g -Wall oshiete.m -o oshiete $ ./oshiete Segmentation fault ちなみにコンパイラを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:5: error: cannot find interface declaration for ‘NXConstantString’ @によってNSStringが作成されるのは、どのような環境が揃ったときなのでしょうか? 何か満たしていないものがあると思うのですが。 でも、これってObjective-c1.0の言語仕様ですよね? ほかの方のブログなど見てると使えるようなのですが、自分が使えない理由を 調べる方法が分からず困っています。 何かヒントを教えていただけないでしょうか。 よろしくお願いいたします。 (上記のgccコンパイルエラーは参考までに載せました。clangでの解決を目指したいです)

  • ウィンドウズでobjective cを勉強したいのですが、

    ウィンドウズでobjective cを勉強したいのですが、 gnustepのインストールが難しくて出来ません。 gnustep cdとかあるらしいのですが、 それはウィンドウズではないので、 ウィンドウズで簡単にインストール出来る gnustepは無いでしょうか? あるいは、gnustepのインストールのつぼを教えて下さい。 現況、gccを動かすと、動くのですが、何か メッセージが出てコンパイルされません。

  • Objective-Cについて

    今、Objective-Cを独学で勉強しているのですが、 プログラムで int a1; int a2; int b1 = 1; int b2 = 1; a1 = ++b1; a2 = b2++; NSLog(@"変数a1の値は%dです\n", a1); NSLog(@"変数a2の値は%dです\n", a2); NSLog(@"変数b1の値は%dです\n", b1); NSLog(@"変数b2の値は%dです\n", b2); これで「Run」を押すとそれぞれ、 「変数a1の値は2です」 「変数a2の値は1です」 「変数b1の値は2です」 「変数b2の値は2です」 とOutputされるのですが、この時なぜ「a2」が1と出てくるのか分かりません。 どなたか解説お願いします。

  • C言語のプログラムが実行できません。

    C言語のプログラムが実行できません。 コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。 これは何のエラーなんでしょうか? 基本的な事かもしれませんが、分かる方宜しくお願い致します。

  • objective-c

    初心者です。よかったら、どなたかお答えをおねがいします。 #import <Foundation/Foundation.h> int main (void) { const char *words[] = {"asldkfj",";ljasdf",";lkasj","ioisdji"}; /ここ/ int charsize; charsize = sizeof(words) / sizeof(words[0]); int i; for(i = 0; i < charsize ;i++){ NSLog(@"%s is %d characters long",words[i],strlen(words[i])); } return 0; } 上記のソースでは、wordsがポインタ変数になってますが、配列で、 const char words[] = {"asldkfj",";ljasdf",";lkasj","ioisdji"}; にするとエラーがでます。 配列にすると、要素数は判別できるが、文字数は判別できないってことでしょうか? そうだとしたら、理由を教えてください。 よろしくお願いします。

  • objective-cにはCのような関数はない?

    c言語とobjective-cを並行して勉強しています。 c言語では機能をまとめるために関数を定義できますよね。 ----- void display(int a){ printf("%d" , a); } int main(void){ display(10); } --- これでdisplayという関数に10という引数を渡して表示させることができますよね? objective-cの場合は例えば以下のように書くことがわかり、コンパイルも通りました。 - (void)display{ NSlog(@" TEST "); } しかし・・・・呼び出すことができませんね。。。 objective-cの場合は[ インスタンス メソッド名 ]; のような呼び方なのですよね。 メソッドだけを呼び出すことはできない、ってことなのでしょうか・・・? 色々検索してみたのですが、 @implement~@endで囲んでクラスにして インスタンスを作って、メソッドを呼ぶ方法ばかりで、 上記のC言語の例のような、単純な関数定義→呼び出しの方法を見つけることができませんでした。 上記のようなC言語の例はよくあると思うのですが、 これと同じことがobjective-cで、できるともできないとも、書いてないように思います。 例えば上のc言語と同じ動作をobjective-c に移植するとどうなるのでしょうか・・・?というか、不可能、ということでしょうか・・・?

  • C言語について

    #include <stdio.h> struct syoukai{ int no; char name[5]; }; int main(void) { struct syoukai mine = {3, "aaaaa"}; int cmdID ; printf("コマンドを入力してください\n"); scanf("%d\n",cmdID); if(cmdID == 1) printf("%d\n",syoukai.no, syoukai.name); } これをコンパイルして実行すると Segmentation fault とエラーになってしまい原因がわかりません 教えていただけますか?

  • objective-Cについてご相談があります。

    objective-cを勉強しているのですが、 以下のメソッドの内容がいまいち分かりません。 どなたか解説して頂けないでしょうか・・・ ログを取ると、 「1:1   2:1」 、 「1:1  2:2」 といった感じで、2つ目の数値が、ボタンを押すたびに 増えていくのですが、この内容がどういった所に使われる のかが分かりません。 ------------------ここから--------------------------- // [変数]ボタン押下 - (IBAction)pushButton01:(id)sender { // 自動変数 auto int i01 = 0; // autoは普段省略されている i01++; // i01 = i01 + 1;と同義 NSLog(@"1:%d", i01); // 静的変数 static int i02 = 0;// どんどん増えていく i02++; NSLog(@"2:%d", i02); } --------------ここまで---------------------------- 以上、お手数ですが、何卒宜しくお願い致します。

  • [Objective-c] NSlogとループ

    Objective-cの勉強を始めたばかりです。 ループ処理内のNSlogについて質問させてください。 下の方にあるソースコードにて実行すると、 何回かに1回なのですがループが最後まで回らずNSlogにて 最後まで出力されない。 ( 変数aの値は32です のように途中までしか出力されない、  一番最後までループすれば 変数aの値は1024です が出力されて  ループを抜けるはずです。) MacOSX10.7.4 Core i5 2.2GHz Xcode 4.3.2 そこで下記複数質問があります。 1.内部でどんなエラーが起こっているのでしょうか?  (メモリー確保・解放ができていない?   前回処理が完了する前に次の処理を実行しようとしている?) 2.下部ソースのコメントアウトにインターバル(sleepForTimeInterval)を  もうける処理がありますが、これをコメントはずして実行すると、  何度実行しても最後まで出力されるようになりました。  このような処理を入れるのが当たり前なのでしょうか? #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... int a=1; for(;a<1000;a=a*2) { // [NSThread sleepForTimeInterval:0.005]; NSLog(@"変数aの値は%dです\n",a); } } return 0; } 以上、よろしくお願いいたします。

  • Objective-Cでのエラー

    よろしくお願いします。「Xcode5ではじめるObjective-Cプログラミング(大津真著)」という本を購入し、Objective-Cの勉強をはじめました。Objective-Cが初めてのプログラミング初心者です。 本に記載されたコードを入力しているのですが、下記でエラーが出て困っています。 何度も見なおしたのですが本との違いを見つけることができませんでした。 どこがおかしいのかお分かりの方がおられましたらどうか教えて下さい。 ●エラー more '%' conversions than data arguments が、下記の2箇所で出ます。(いずれも生年月日の前の@ に矢印がでています。) >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), 実行すると Thread 1:EXC_BAD_ACCESS(code=EXC_1386_GPFLT) とでます。 ---------- // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *personA = [[Person alloc]init]; [personA setName:@"吉田一郎"]; NSDate *dateA = [NSDate dateWithString:@"1979-11-12 00:00:00 +0900"]; [personA setBirthday:dateA]; [personA setHeight:180.5]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personA name], [personA birthday], [personA height]; Person *personB = [[Person alloc]init]; [personB setName:@"山田太郎"]; NSDate *dateB = [NSDate dateWithString:@"1981-03-01 00:00:00 +0900"]; [personB setBirthday:dateB]; [personB setHeight:172.3]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personB name], [personB birthday], [personB height]; } return 0; } ---------- // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject -(void)setName:(NSString *)name; -(NSString *)name; -(void)setBirthday:(NSDate *)birthday; -(NSDate *)birthday; -(double)height; -(void)setHeight:(double)newValue; @end ---------- // Person.m #import "Person.h" @implementation Person { NSString *_name; NSDate *_birthday; double _height; } -(void)setName:(NSString *)aName { _name = aName; } -(NSString *)name { return _name; } -(void)setBirthday:(NSDate *)aBirthday { _birthday = aBirthday; } -(NSDate *)birthday { return _birthday; } -(void)setHeight:(double)aHeight { _height = aHeight; } -(double)height { return _height; } @end

専門家に質問してみよう