アプリ版:「スタンプのみでお礼する」機能のリリースについて

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件です。

自力での解決が困難です。
どなたかお力添えをお願いいたします。

A 回答 (2件)

「GNUstep」で、ネット検索してみると、下記のリンクがヒットしました。



http://www.moonmile.net/blog/archives/595

NSLogが使えているようです。
<Foundation/NSObject.h>をインポートしてみてはどうでしょう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/25 22:59

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/

ひょっとして、これでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/25 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!