在C 程序中编译C 功能

Compile a C++ function inside a C++ program

本文关键字:功能 编译 程序      更新时间:2023-10-16

考虑以下问题,

一个C 程序可能会发出C 函数的来源,例如,它将创建一个带有内容的字符串:

std::vector<std::shared_ptr<C>> get_ptr_vec()
{
    std::vector<std::shared_ptr<C>> vec;
    vec.push_back(std::shared_ptr<C>(new C(val1)));
    vec.push_back(std::shared_ptr<C>(new C(val2)));
    vec.push_back(std::shared_ptr<C>(new C(val3)));
    vec.push_back(std::shared_ptr<C>(new C(val4)));
    return vec;
}

当程序创建上面的源字符串时,val1等的值将在运行时确定。此源将写入文件,例如 get_ptr_vec.cpp

然后,另一个C 程序将需要读取此源文件并进行编译,并调用get_ptr_vec功能并获取其返回的对象。有点像JIT编译器。

有什么办法可以做到这一点?我认为一个解决方法是将有一个可以编译文件的脚本,将其构建到共享库中。第二个程序可以通过dlopen获取功能。但是,无论如何是否可以跳过此问题并拥有第二个程序来编译文件(无需致电system(。请注意,第二个程序将无法在编译时看到此源文件。实际上,第一个程序可能会有数千个这样的小源文件。

给出一点背景,第一个程序将构建一棵表达式树,并通过通过Postorder穿越树来序列化树。树的每个节点都会将字符串表示写在文件上。第二个程序将读取此序列化的树节点的列表,并且需要能够将此字符串列表重建为C 对象列表(然后从此列表中,我可以重建树(。

我认为LLVM框架可能可以在这里提供。有人可以给我一些指示吗?没有必要一个完整的答案,只是让我开始的地方。

您可以使用Clang和Emit LLVM BitCode(-emit-llvm FLAG(编译生成的代码。然后,从静态地将您的程序与LLVM的一部分联系起来,这些LLVM的部分读取了比特码文件并将其添加。最后,将编译的比特码并在其上运行JIT,因此它们将在您程序的地址空间中可用。