将字符串转换/编译为 Objective-C 中的可执行代码

2024-01-07

我想在 ObjC 中获取一个字符串并对其进行评估,就好像它是代码一样。例如(这些是虚构的函数):

NSString *Cmd=@" if (10>5) NSLog(@"Test");  ";
MyClass.Run(Cmd);

我希望“Test”出现在输出日志中。我搜索并测试了很多代码示例和库,但仍然没有好的结果。

我最终得到了这两个用于运行时编译的库:

1- libClang框架和clang_Cursor_Evaluate函数。

https://www.mikeash.com/pyblog/friday-qa-2014-01-24-introduction-to-libclang.html https://www.mikeash.com/pyblog/friday-qa-2014-01-24-introduction-to-libclang.html

https://github.com/root-project/cling https://github.com/root-project/cling

2- objc-eval 框架。

https://github.com/antipax/objc-eval/blob/master/README.mdown https://github.com/antipax/objc-eval/blob/master/README.mdown

我无法使用 libClang 做任何事情。现在保持原样,但对于第二个,我成功编译了框架并在一个简单的项目中实际使用了它,但仍然没有正确的输出!

#import <Foundation/Foundation.h>
#import "OEEvaluation.h"
void main()
{
Code1:OEEvaluation *evaluation = [OEEvaluation evaluationWithCode:@"retun @\"Hello World!\" ;" delegate:nil];
Code2://OEEvaluation *evaluation = [OEEvaluation evaluationWithCode:@"NSLog(@\"Hello World!\");" delegate:nil];
NSLog([evaluation evaluateSynchronously]);
NSLog(@"Test");
}

Code1 和 Code 2 没有输出:没有(空),没有错误,没有提示..什么也没有。

代码 1 是框架文档中的确切示例。

也许我错了,但我认为我找到的解决方案是我的研究中最接近答案的解决方案。

现在的问题是:

1-我怎样才能实现这个想法(将字符串转换为可执行代码的可执行行)?

2-如何让 objc-eval.framework 工作?


我怎样才能让 objc-eval.framework 工作?

完整的源代码已经提供,请按照自己的方式进行操作。

您会发现它通过将代码拼接到 Xcode 项目中来运行您的代码,该项目是通过解压tar存档,调用xcodebuild编译该项目,然后动态加载编译后的代码并执行它。

您的第一个问题是 tar 压缩的存档相当旧,需要更新为最新版本的 Xcode – Xcode 提供了执行此操作的选项。完成此操作后,项目将进行编译,但您会发现编译后的代码不在该框架期望的位置 - 这是因为默认情况下,设置产品位置的项目设置在最新版本的 Xcode 中被覆盖。

你需要探索 XcodePreferences…,该项目的Build Locations设置、参数xcodebuild命令采用,以及框架中加载已编译的二进制文件的代码,以决定哪些设置将在您想要的位置获取已编译的二进制文件,以便框架可以访问它。

一旦你这样做了,你就会发现这个框架是有效的。请注意,要实现此功能,需要在运行应用程序的任何系统上安装 Xcode。

玩得开心!

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串转换/编译为 Objective-C 中的可执行代码 的相关文章

随机推荐