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 がうまくコンパイルできます。かつ、うまく動きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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 だけでコンパイルしてみると。

1
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

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

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

~~~

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

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

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

1
2
3
4
5
6
7
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 の実機にデプロイするには?という壁があるので、一筋縄ではいきそうもありませんが。

コメントは停止中です。