当前位置: 首页 > 面试题库 >

有什么方法可以在运行时使用C或C ++编译其他代码吗?

濮阳繁
2023-03-14
问题内容

这是我想做的:

  1. 运行程序并初始化一些数据结构。
  2. 然后,编译可以访问/修改现有数据结构的其他代码。
  3. 根据需要重复步骤2。

我希望能够既要做到这一点C,并C++使用gcc(并最终Java于)类Unix系统(特别是Linux和Mac OS
X)。这个想法基本上是为这些语言实现read-eval-
print循环,该循环会在输入表达式和语句时对其进行编译,并使用它们来修改现有的数据结构(该操作始终以脚本语言完成)。我正在用编写该工具python,该工具会生成C/
C++文件,但这应该无关紧要。

我已经探索过使用共享库执行此操作,但了解到修改共享库不会影响已经在运行的程序。我也尝试过使用共享内存,但是找不到将函数加载到堆上的方法。我也考虑过使用汇编代码,但尚未尝试使用。

我宁愿不要使用任何编译器,gcc除非绝对没有办法在中进行编译gcc

如果任何人有任何想法或知道如何执行此操作,将不胜感激。


问题答案:

我认为您可以使用动态库并在运行时(使用dlopen和朋友)加载它们来完成此操作。

void * lib = dlopen("mynewcode.so", RTLD_LAZY);
if(lib) {
    void (*fn)(void) = dlsym(lib, "libfunc");

    if(fn) fn();
    dlclose(lib);
}

显然,您在进行过程中将不得不编译新代码,但是如果您继续替换,mynewcode.so我认为这将对您有用。



 类似资料:
  • 问题内容: 是否可以编译无需重新编译即可在所有Linux发行版中执行的C / C ++源代码? 如果答案是肯定的,我可以使用任何外部(非标准C / C ++)库吗? 我要分发我的二进制应用程序,而不是分发源代码。 问题答案: 不,您不能编译在所有Linux发行版中执行的可执行文件。但是,您可以编译可在人们倾向于关注的大多数发行版上运行的可执行文件。 编译32位。为您愿意支持的最低CPU级别进行编译

  • 代码不编译。我不明白错误是什么,请帮忙) 错误文本:g-Wall-c“main.cpp”(/media/ad/4GB-NTFS/prog/laba2)main。cpp:In函数“int main()”:main。cpp:46:12:错误:调用“Record::Record()”记录r1;^主要的cpp:12:1:注意:候选者:Record::Record(std::\u cxx11::string

  • 问题内容: 我需要加密一些已经公开发布的PHP源代码。 这可能吗?可以“编译” PHP吗? 问题答案: 您可以购买Zend Guard来编码您的PHP源代码,然后使用Zend Optimizer 来运行它。也有一个开放源代码/免费的PHP编译器项目(bcompiler,并且也对此进行了介绍),但我从未使用过它,因为当时我需要它时该项目仍不完整。

  • 我有一个类,它被设计为继承。它当前有一个纯虚拟方法,如下所示: 名称实际上是类属性,而不是实例属性。它不应该在子类的实例之间更改,所以实际上,虚拟并不是最好的选择。无论如何,我现在遇到了一个问题,在编译时需要在模板函数中使用名称。显然,不起作用,而且由于子类不是默认可构造的,我甚至不能用来解决它。 所以有些事情需要改变,但是我不知道最好的方法。我需要能够在以下情况下访问名称: 在编译时,当我有一个

  • 有没有办法使用MinGW作为MS Visual C++的替代品?很多Python包都需要VS C++才能安装:4.5GB的磁盘空间!MinGW只需要450 MB,就可以达到编译C/C++的目的。 我使用的是Visual Studio代码,我尽量避免在3)-->中建议的Microsoft Visual C++安装,您也可以只安装C++构建工具:https://Code.visualstudio.co

  • 问题内容: 我的代码中出现了很多错误。因此,我希望能够在一开始就将它们最小化,或者在执行代码之前看到尽可能多的错误。这可能吗,如果可以,我该怎么做? 问题答案: 如果您在语法方面遇到问题,可以尝试使用语法突出显示的编辑器。除非您有一种语言的感觉,否则简单的错误将不会突然出现。 调试的最简单形式是插入一些打印语句。一种更高级(且可扩展)的方法是使用std lib中的日志记录模块。 交互式解释器是使用