我是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
答案 0 :(得分:0)
您可能至少需要对每个DLL中的符号进行至少一次硬静态引用。在main()中,尝试添加[NSConstantString class];
(如果需要,添加声明)。
Windows动态链接器非常主动,不加载没有硬符号引用的DLL。这与Objective-C的动态查找冲突。
(这是基于经验的猜测。自从我在Windows上完成ObjC以来已经十年了,但似乎很少有变化。)