clang+llvm で objective-c 2.0 をコンパイルする

LLVM-GCC 4.2 Front End Binaries for Mingw32/x86
http://llvm.org/releases/download.html#2.9
KMC Staff Blog:Clang と LLVM を使ってみる。
http://blog.kmckk.com/archives/2435798.html

実は、よく分からんというのが本音ですが、mingw + gnustep の組み合わせだと objective-c の @property がコンパイルできません。

なので、先のリンクから↓の3つをダウンロードしてきて c:\llvm とかに移動

Clang Binaries for Mingw32/x86 (23M)(.sig)
LLVM Binaries for Mingw32/x86 (23M)(.sig)
LLVM-GCC 4.2 Front End Binaries for Mingw32/x86 (26M) (.sig)

別に入っている

GNUstep Windows Installer
http://www.gnustep.org/experience/Windows.html

の include を設定すると、@property がうまくコンパイルできます。かつ、うまく動きます。

#import <stdio.h>
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>

@interface Hello: NSObject
{
	@private
	NSString *_msg ;
}
@property (nonatomic,retain) NSString *msg;
@end

@implementation Hello
@synthesize msg = _msg ;

- (void)print
{
	// NSLog( _msg );
	printf("%s\n", [_msg cString]);
}
- (void)dealloc
{
	NSLog( @"in dealloc" );
	[super dealloc];
}
@end


int main(int argc, char *argv[])
{
	puts("hello obj-c world.");
	Hello *hello = [[Hello alloc] init];
	hello.msg = @"hello objc world.";
	[hello print];
	[hello release];

	return 0;
}

こんな風に @property を使ったコードを書いておきます。

そして、最初は clang だけでコンパイルしてみると。

clang -o main3 main3.m -I /llvm/include -I /GNUstep/GNUstep/System/Library/Headers -L c:/GNUstep/GNUstep/System/Library/Libraries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString

のようにコンパイルして実行すると、次のようにうまく動きます。

C:\work\alice\objc>main3
hello obj-c world.
2011-07-05 18:12:32.113 main3[2400] in dealloc

~~~

試しに vm 上で動かしてみようと

clang -emit-llvm -S main3.m -I /llvm/include -I /GNUstep/GNUstep/System/Library/Headers
llvm-as main3.s
lli main3.s.bc

な風にコンパイルしましたが、

C:\work\alice\objc>lli main3.s.bc
LLVM ERROR: Program used external function '__objc_exec_class' which could not b
e resolved!
Stack dump:
0.      Program arguments: lli main3.s.bc
1.      Running pass 'X86 Machine Code Emitter' on function '@.objc_load_functio
n'

な風に実行エラーになりますね。objc のランタイムを clang でコンパイルして配置するんでしょうが。

カテゴリー: 開発, Objective-C パーマリンク

clang+llvm で objective-c 2.0 をコンパイルする への2件のフィードバック

  1. 匿名 のコメント:

    コンパイルして配置するんでしょうが。
    35.65386552973979, 139.28319185822124

    • masuda のコメント:

      「コンパイルして配置するんでしょうが」…の続きは、objc のランタイム自体を clang でコンパイルして配置しないと、windows の llvm 環境では動かないのだろう、ってことです。
      これで、llvm 上で動くとすれば、llvm 環境自体は os x 上でも動くので、そうなると os x で xcode を使ってビルドしている iphone の実行ファイルも windows 環境でビルド可能ではないか?ってことです。
      まあ、iphone の実機にデプロイするには?という壁があるので、一筋縄ではいきそうもありませんが。

コメントは停止中です。