我能通过字符串编译C ++源代码吗?

时间:2015-07-02 23:03:03

标签: java c++ compilation

我知道可以使用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:根据要求,String可以由用户生成(在GUI中输入 - JTextArea)或从.cpp文件中读取..

3 个答案:

答案 0 :(得分:0)

如果您使用的是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项目之前检查您的文件。

希望有所帮助。

答案 1 :(得分:0)

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

但要注意LLVM不提供稳定的API,因此很难构建继续工作的示例。即使使用C API(仍需要更新SONAME),我的每个LLVM版本都会出现故障。

答案 2 :(得分:0)

  

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

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

实际上,C ++编译器实际上需要制作很多optimizations(如果你希望代码运行的速度不要太慢),那么将花费一些重要时间(相对于计算机速度,例如十分之几秒)甚至对于一个小的C ++源代码来编译生成的C ++代码。严重模板化的C ++代码可能需要花费大量时间(甚至在病态情况下无限量,因为C++ templates are accidentally Turing Complete)。

所以实际上,没有编写C ++源文件没有任何好处。一些编译器(例如Linux上的GCC g++ -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库,如gccjitLLVM,{{3} },libjitlightning等等......然后你会生成一些asmjit - 就像代码的内部表示(特定于JIT库!)。