【问题标题】:How to generate and compile C++ code while the program is running?如何在程序运行时生成和编译 C++ 代码?
【发布时间】:2013-11-30 09:01:18
【问题描述】:

所以基本上我需要的不是特定的代码(当然那会很棒),而只是关于如何实现我的目标的想法和方法。

1) 我必须用 C++ 创建一个程序,它会生成一个 C++ 代码的小例子,每次都有点不同。 (这对我来说没有问题,我将使用模板并随机化代码中的一些变量,这将使其每次都唯一。)

2) 我将显示生成的代码,用户必须输入他认为代码打印出来的内容。

问题就从这里开始

3) 我必须获取生成的代码并以某种方式对其进行编译,以获得一个带有程序将打印出的文本的字符串。

4) 然后将字符串与用户输入的内容进行比较。

所以第 3 步)是我停下来的地方,没有帮助就无法弄清楚...我想在 .cpp 文件的函数中编写生成的代码,然后调用该函数,但我做不到没弄好,所以我开始想,我应该请教专家,也许还有其他一些方法或想法如何实现。

【问题讨论】:

    标签: c++ compilation


    【解决方案1】:
    1. 编写 .cpp 文件
    2. 调用编译器(或 make 或等效的构建系统)
    3. 如果编译失败,大概会显示错误?
    4. 如果编译成功,运行生成的程序并显示输出

    将 2/3/4 包装到脚本中并使用 systempopen 调用它可能是最简单的。该脚本可以确保文件名是唯一的,将 stderr 折叠到 stdout 等。

    您正在运行的程序并没有真正与编译后的代码进行交互,只是读取输出,因此将其作为一个单独的进程可能是最简单的。该脚本可以添加一些标记来帮助您将编译器输出/错误与程序输出区分开来。


    我已经很多年没有编写批处理文件了,但是一旦您知道如何从命令行 (ref) 运行编译器,您就可以编写脚本:

    1. 编译一个.cpp文件
    2. 执行生成的.exe
    3. 将其输出重定向到文件

    然后,在 C++ 中,您只需将代码保存到脚本所需的 .cpp 文件中,像 system("myScript.bat") 一样执行脚本,然后读取输出文件。

    如果您不想编写单独的批处理脚本,您可以调用一次system 来调用编译器,然后再次执行生成的.exe

    【讨论】:

    • 这听起来很有希望,但我仍然不知道如何调用编译器。实际上这就是我所需要的,我需要在执行主要文件时编译另一个 .cpp 文件......你能更具体吗?
    • 调用编译器的方式是平台特定的(和编译器特定的)。您能告诉我您现在使用的是什么平台、编译器和构建系统吗?
    • 我正在开发 64 位 win 7,使用 MS Visual Studio 2010 Express,我真的不能告诉你更多(我不知道)。我没有改变任何东西,一切都是默认的,希望这就足够了
    • ...修正了答案并提供了更多细节。
    • 非常感谢!!!现在我只需要弄清楚如何通过命令行编译 cpp 然后创建一个批处理文件。
    【解决方案2】:

    我认为您正在寻找一种编写 c++ 脚本的方法。看看http://www.softintegration.com/ 或这个stackoverflow 问题Any tutorial for embedding Clang as script interpreter into C++ Code?

    【讨论】:

      【解决方案3】:

      我没用过,但是它是免费的,而且不编译而是解释。非常适合你的问题,值得一试...

      http://root.cern.ch/drupal/content/cint

      【讨论】:

        【解决方案4】:

        为什么不使用 system() 调用独立编译生成的代码? system("g++ temp.cpp -o temp.exe); -- 这类东西然后基于返回值 您可以像 system("temp.exe"); 一样再次运行 temp.exe;当然,您可以将 temp.exe 的输出打印到一个文件中,然后读取该文件以将 temp.exe 的输出输出到您当前的程序中。..

        【讨论】:

          【解决方案5】:

          Geordi 这样的东西会起作用吗?

          【讨论】:

            【解决方案6】:

            您可以像调用任何外部工具一样调用 c++ 编译器。例如。 system("g++ test.cpp") 或使用 popen 或您的平台提供的任何其他内容。

            您还可以考虑将实现编译器的库集成到您的程序中。为此,您可能需要查看 clang 和 llvm。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-07-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多