1

私はLLVMを初めて使用します。私は昨日GnuStepによってWindows上にLLVMとClangを構築しました。

LLVM+CLang:3.2
GCC:4.6.1(GnuStep)
OS:Win7 64

Objective-cのソースファイルをビットコードとexeの両方にコンパイルできます。exeは機能しますが、ビットコードを実行しようとすると、次のエラーが発生しました。

LLVM ERROR: Could not resolve external global address: 
    _OBJC_CLASS_NSConstantString

質問:

How can I load dll or lib files in llvm? 
How can I link lib files(ex: libobjc.dll.a) to bitcode? Is that possible?

hello.m

#import <Foundation/Foundation.h>
int main(int argc, char**argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"Hello Objective-C\n");
    [pool release];
    return 0;
}

Makefile

CC=gcc
CCFLAGS=-fconstant-string-class=NSConstantString -ID:/GNUstep/GNUstep/System/Library/Headers
LDFLAGS=-LD:/GNUstep/GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base

CLANG=clang
CLANG_FLAG=-c -fobjc-runtime=gcc -emit-llvm

LLC=llc
LLI=lli
LLI_FLAG=-load=D:\GNUstep\GNUstep\System\Tools\objc-4.dll -load=D:\GNUstep\GNUstep\System\Tools\gnustep-base-1_24.dll
#LLI_FLAG=-load=D:\GNUstep\GNUstep\System\Library\Libraries\libgnustep-base.dll.a -load=D:\GNUstep\GNUstep\System\Library\Libraries\libobjc.dll.a

all:hello.obj hello1.exe

hello.exe: hello.o
     $(CC) -o hello.exe hello.o $(LDFLAGS)

hello.obj: hello.bc
    $(LLC) -filetype=obj hello.bc

hello.bc:hello.m
    $(CLANG) -o hello.bc hello.m $(CLANG_FLAG) $(CCFLAGS)

hello1.exe: hello.m
    $(CLANG) hello.m -o hello1.exe $(CCFLAGS) $(LDFLAGS)

run:
#Err
    $(LLI)  $(LLI_FLAG) -force-interpreter=false hello.bc
#OK
    hello.exe
#OK
    hello1.exe

clean:
    rm *.o
    rm *.exe
    rm *.bc
4

1 に答える 1

0

各DLLのシンボルへの少なくとも1つのハードで静的な参照が必要になる可能性があります。main()で、追加してみてください[NSConstantString class];(必要に応じて宣言を追加してください)。

Windowsダイナミックリンカは、ハードシンボル参照なしでDLLをロードしないことについて非常に積極的です。これは、Objective-Cの動的ルックアップと競合します。

(これは経験に基づく推測です。WindowsでObjCを実行してから10年が経ちましたが、ほとんど変わっていないようです。)

于 2012-12-28T15:42:09.237 に答える