考虑以下问题,
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
)。请注意,第二个程序在编译时将无法看到此源文件。事实上,第一个程序可能会发出数千个这样的小源文件。
为了提供一些背景知识,第一个程序将构建一个表达式树,并通过遍历后序来序列化树。树的每个节点都有一个写入文件的字符串表示。第二个程序将读取这个序列化树节点的列表,并且需要能够将这个字符串列表重建为一个 C++ 对象列表(稍后我可以从这个列表重建树)。
我认为 LLVM 框架可能在这里提供一些东西。有人可以给我一些指示吗?不需要完整的答案,我只是从某个地方开始。
最佳答案
您可以使用 clang 编译生成的代码并发出 LLVM 位码(-emit-llvm
标志)。然后,将您的程序与读取位码文件和 JIT 的 LLVM 部分静态链接。最后,获取已编译的位码并对它们运行 JIT,这样它们就可以在您的程序的地址空间中使用。
关于c++ - 在 C++ 程序中编译 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767346/