如何在LLVM中加载DLL或lib文件?

时间:2012-12-28 10:23:54

标签: objective-c llvm gnustep

我是LLVM的新手。我昨天在GnuStep的Windows上构建了LLVM和Clang。

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

我可以将Objective-c源文件编译为bitcode和exe。 exe工作,但当我尝试执行bitcode时,我收到了这个错误:

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;
}

生成文件

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

1 个答案:

答案 0 :(得分:0)

您可能至少需要对每个DLL中的符号进行至少一次硬静态引用。在main()中,尝试添加[NSConstantString class];(如果需要,添加声明)。

Windows动态链接器非常主动,不加载没有硬符号引用的DLL。这与Objective-C的动态查找冲突。

(这是基于经验的猜测。自从我在Windows上完成ObjC以来已经十年了,但似乎很少有变化。)