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件です。
自力での解決が困難です。
どなたかお力添えをお願いいたします。
No.2ベストアンサー
- 回答日時:
「GNUstep」で、ネット検索してみると、下記のリンクがヒットしました。
http://www.moonmile.net/blog/archives/595
NSLogが使えているようです。
<Foundation/NSObject.h>をインポートしてみてはどうでしょう?
ご指摘のインポートでは変化はありませんでした。
教えていただいたサイトは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自体は動作したので、@が使えない問題を改めて質問してみることにします。
ありがとうございました。
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/
ひょっとして、これでしょうか?
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
1 つ以上の複数回定義されてい...
-
” OS ビルド ” の意味が分か...
-
<math.h>があるのにsqrtが・...
-
「fatal error C1189」を回避す...
-
必要なDBG ファイルが見つから...
-
Makefile作成時の拡張子.oとは?
-
動的な変数名のつけ方について
-
Microsoft の Visual C++ サン...
-
外部シンボル "_main"は未解決です
-
クリティカルエラー Expressio...
-
2G以上のファイル操作
-
Borland C Builder とOpenCVを...
-
C++/CLIで、アンマネージC++のD...
-
アプリケーションの配布
-
VC60とVC70の違いは?
-
VMwareのLinuxでコンパイルでき...
-
複数のサブディレクトリを一緒...
-
コンパイルエラー
-
NOTIFYICONDATAについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
1 つ以上の複数回定義されてい...
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
C++コンパイル時に『 C1083: in...
-
外部シンボル "_main"は未解決です
-
PRO*C コンパイルエラー
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
ビルドとリビルドの違いを教え...
-
RPGでプログラムからソースファ...
-
戻り値について
-
C++のhppファイルをCでinclude
おすすめ情報