我正在运行OSX,使用Clang编译一些使用OSX Cocoa类的Obj-C代码,我正在尝试使用LLVM JIT编译器运行结果.我正在使用LLVM/Clang的最新版本.
编译或链接我的代码没有问题,我可以毫无困难地愉快地进行C和C++系统调用.但是我所有的Obj-C调用都惨遭失败,而且我不能深入研究原因!该objc_msgSend()函数似乎被正确调用,但运行时拒绝识别最简单的选择器.
我设法使用Clang和LLI重现问题,这是如何做到的:
创建一个简单的文件test.mm:
#include <Cocoa/Cocoa.h>
#include <cstdio>
#include <iostream>
extern "C" int main (int, char**)
{
std::cout << "==== step 1" << std::endl;
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[pool release];
std::cout << "==== step 2" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
..用clang将它编译成bitcode:
clang -emit-llvm test.mm -c -o test.bc
Run Code Online (Sandbox Code Playgroud)
然后用lli运行它:
lli -load=/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation test.bc
Run Code Online (Sandbox Code Playgroud)
lli的输出如下所示:
==== step 1
objc[45353]: Object 0x101a362a0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() …Run Code Online (Sandbox Code Playgroud)