我对在Ruby on Rails 4 App中实现用C ++编写的程序感兴趣。
C ++应用程序在控制台中运行并通过给它一个文件来工作,它处理它然后它输出另一个文件。
我找到了'Ruby Inline',据称允许使用外国代码的宝石:
https://rubygems.org/gems/RubyInline
gem 'RubyInline', '~> 3.12', '>= 3.12.4'
Inline允许您在ruby代码中编写外部代码。它会自动确定相关代码是否已更改,并仅在必要时进行构建。然后,扩展会自动加载到定义它的类/模块中。您甚至可以编写额外的构建器,以便用任何语言编写内联代码。使用Inline :: C作为模板,并查看Module#inline以获取所需的API。
根据文档,它允许使用这样的C和C ++程序:
require 'inline'
class MyTest
inline(:C) do |builder|
builder.include '<iostream>'
builder.add_compile_flags '-x c++', '-lstdc++'
builder.c '
void hello(int i) {
while (i-- > 0) {
std::cout << "hello" << std::endl;
}
}'
end
end
t = MyTest.new()
t.hello(3)
问题在于我不完全确定如何使用由多个文件构成的更大的C ++程序来实现它,我不熟练使用C ++。
这似乎是在Ruby脚本中添加C ++代码的宝石,C ++程序由多个文件和文件夹组成。
Ruby Inline会为我想做的事情工作还是有更好的选择?
有没有办法直接调用C ++应用程序而不将其放在ruby文件中?
将提供给C ++应用程序的文件将通过Web界面上传,如何将其提供给C ++程序,以便输出结果?
答案 0 :(得分:2)
Ruby支持使用`
字符运行本机命令的功能。例如,我们在下面有一个C ++程序,它接受两个参数,然后打印到它们的标准输出,连接在一起。该计划的课程代码如下所示:
#include <iostream>
int main(int argc, char ** argv){
std::cout << argv[1] << argv[2] << std::endl;
return 0;
}
虽然C ++代码实际上只需要编译一次,而且这个步骤可能不是必需的,但我们可以通过执行以下操作从ruby中编译它:(可以用编译器替换g ++如果命令成功编译,我们将变量success
设置为true,否则设置为false。
pathToSource = "your/path/to/file.cpp"
outputBinaryFile = "your/desired/output/file.bin"
success = system("g++ #{pathToSource} -o #{outputBinaryFile}")
现在我们编译了代码,我们可以通过在ruby中运行以下代码来执行它:
word1 = "Hello"
word2 = "World"
commandOutput = `./#{outputBinaryFile} '#{word1}' '#{word2}'`
将commandOutput
设置为:"HelloWorld\n"
您可能需要根据正在运行的系统更改诸如编译器之类的小东西,但这应该适用于* NIX系统。