小编jul*_*s72的帖子

使用LLVM ExecutionEngine调用Objective-C方法时,无法识别所有选择器

我正在运行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)

jit objective-c llvm clang executionengineexception

13
推荐指数
1
解决办法
678
查看次数

标签 统计

clang ×1

executionengineexception ×1

jit ×1

llvm ×1

objective-c ×1