【问题标题】:Am I able to compile a C++ source code via a string?我可以通过字符串编译 C++ 源代码吗?
【发布时间】:2015-07-02 23:03:03
【问题描述】:

我了解可以使用 JavaCompiler 通过字符串编译 java 源代码。使用包含我的 java 代码的长字符串,我可以测试我的代码是否可编译。

来源:http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html

一个例子:http://www.java2s.com/Code/Java/JDK-6/CompileaJavafilewithJavaCompiler.htm

我的问题是:我有一个包含可编译 C++ 代码的长字符串。我可以使用某种形式的 java 库做类似的事情吗?还是不可能的?

谢谢

编辑 1:根据要求,字符串可以由用户生成(在 GUI - JTextArea 中键入)或从 .cpp 文件中读取。

【问题讨论】:

  • 简而言之:不,C++ 运行时中没有内置编译器。您当然可以编写代码,通过在该输出上运行编译器来将程序的某些输出编译到另一个程序中[并且至少一些编译器可以使用程序中的stdout作为编译器的输入来做到这一点,所以您实际上不需要生成这样的文件]
  • Aww .. 感谢您的回复... 我的真正目标是当我的程序(使用 java)是读取 java 源代码的 C++ 并测试输入源代码是否可编译。由于我不能这样做,我想我必须取消该功能:(.. 谢谢你的洞察力。
  • 您可以将字符串重定向到gcc via the command line...(通过调用system
  • 你可以通过创建一个临时文件并调用system("g++ temfile.cpp"); 或类似的东西来做到这一点。或者您可以与编译器库集成,例如 libclang,它允许您在自己的程序中构建自己的编译器 - 但这比调用系统要多得多。
  • 如果你有 gcc,你可能还有popen,这是一个更好的方法来确定你的源代码是否编译。 system 的反馈相当有限。

标签: java c++ compilation


【解决方案1】:

如果您使用的是 VisualStudio,您可以使用预构建事件来调用 c++ 编译器并编译文件。如果您遇到错误,您的 Java 项目将无法构建。这里的想法是您在构建之前使事件发生。您可以随意制作该事件,例如,检查文件是否编译,

这里有一个教程:https://dillieodigital.wordpress.com/2012/11/27/quick-tip-aborting-builds-in-visual-studio-based-on-file-contents/

在他输入要运行的脚本的部分,您可以调用您最喜欢的 c++ 编译器。他检查的不是同一种文件,但原理是一样的,他检查的是一个文件。

如果您正在运行 Windows,如果您正在使用 VisualStudio,那么下面的内容将会有所帮助。

在命令行上编译原生 C++ 程序: https://msdn.microsoft.com/en-us/library/ms235639.aspx

因此,基本上,您正在让 VisualStudio 项目执行预构建事件,这是在命令行上调用 c++ 编译器以在构建 Java 项目之前检查您的文件。

希望对您有所帮助。

【讨论】:

  • 如果您使用的是 Linux,我很确定您可以编写一个 make 文件来编译 Java 和 C++ 程序。如果您使用的是 MacOS,我不知道该怎么做。
【解决方案2】:

如果您链接到LLVM library,则可以使用此功能。

但请注意,LLVM 不提供稳定的 API,因此很难构建可以继续工作的示例。即使使用 C API(仍然需要更新 SONAME),我在每个 LLVM 版本中都遇到了问题。

【讨论】:

  • 其实应该是libclang而不是libllvm
【解决方案3】:

我的问题是:我有一个包含可编译 C++ 代码的长字符串。

C++11 标准没有提到任何能够做到这一点的函数(在某些字符串中编译 C++ 代码)。而且我知道没有库(可能除了libclang,但我不知道它是否能够编译字符串)能够做到这一点。

实际上,一个 C++ 编译器实际上需要大量的optimizations(如果你希望代码运行不太慢的话),所以会花费一些相当长的时间(相对于计算机速度,例如即使对于一个小的 C++ 源代码)来编译您生成的 C++ 代码。并且大量模板化的 C++ 代码可能需要很长时间(在病态的情况下甚至是无限的时间,因为C++ templates are accidentally Turing Complete)来编译。

所以实际上,不编写 C++ 源文件没有任何好处。一些编译器(例如 Linux 上的 GCCg++ -x c++ /dev/stdin)能够从其标准输入编译 C++ 代码,因此您可以使用(在 POSIX 系统上)popen 来提供它们。

只需将您的 C++ 代码写入一些临时 C++ 源文件(可能在一些 tmpfs 文件系统中,如果您想避免磁盘 IO)或者可能是 pipe(7)fifo(7)... 并进行编译。在 Linux 和 Posix 系统上,您可以将该代码编译(例如使用g++ -Wall -fPIC -O -shared /tmp/temporary1234.cc -o /tmp/temporary1234.so)到“插件”或共享对象,您的主程序稍后可以dlopen

如果您正在生成 C++ 代码,您可以考虑使用(而不是生成 C++ 源代码然后编译它),一些 Just-In-Time compilation 库,如 gccjitLLVMlibjitlightning、@987654335 @ 等等...然后您将生成一些类似AST 的代码内部表示(特定于 JIT 库!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多