2017-05-03 64 views
0

考虑以下问题内部,编译C++函数C++程序

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框架可能在这里提供一些东西。有人能给我一些这方面的指示吗?不需要一个完整的答案,只是我的一个开始的地方。

+0

这非常接近 - 应该关闭:_“要求我们推荐或找到书籍,工具,软件库,教程或其他非现场资源的问题与Stack Overflow无关,因为它们倾向于吸引观点回答和垃圾邮件,而是描述问题以及迄今为止解决问题的方法。“_ –

+1

是的,我们通常不会这样做。我们可能从Python脚本或者C++程序生成C++,但是结果总是通过编译器正确传递。 –

+0

为此使用某种序列化库不是更有意义吗? [Boost :: Serialization](http://www.boost.org/doc/libs/1_64_0/libs/serialization/doc/index.html)也许? –

回答

1

您可以使用clang编译您的生成代码并发出LLVM位代码(-emit-llvm标志)。然后,将您的程序与部分LLVM静态链接,读取位码文件并对它们进行JIT。最后,编译位码并在它们上运行JIT,以便它们可以在程序的地址空间中使用。