在C 程序中编译C 功能
Compile a C++ function inside a C++ program
考虑以下问题,
一个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,因此它们将在您程序的地址空间中可用。
相关文章:
- 如何获得CMake Tools以在Visual Studio Code中编译具有C++11(或更高版本)功能的程序?
- C++11 功能 std::map::at 编译旧版本的C++
- 如何在cmake工具链文件中设置编译功能,以便已知的自定义编译器使用target_compile_features
- 如何在专门使用交换功能时修复 gcc8 的编译错误/
- 不同C++功能的编译时间
- 自定义 {fmt} 格式化函数,具有编译时格式字符串检查功能
- 错误错误:无法编译内置功能
- 如何实现声明功能-C 11,编译时间
- 指向功能编译错误的指针
- 在C 程序中编译C 功能
- 编译时未检测到主要功能
- 是否有任何挂钩接口在编译时间内更换功能
- 编译后如何计算某些二进制功能(或基本块)的校验和
- 如果功能超载,则BOOST PHOENIX成员功能操作员无法编译
- 在编译时检查课堂中是否可以使用静态功能
- 使用SFINAE检测编译时间是否存在过载的独立式功能
- 在Linux Mint上编译Qt-OpenGL功能测试失败
- 尝试调用功能指针到成员函数时会出现编译错误
- 如果将功能的非常简单的定义移动到.cpp,则编译时间的减少是多少
- 如果我使用c++11功能编译一个文件,同时将其链接到一个没有c++11编译器选项编译的库,会有什么问题吗