如何在Rails 4 WebApp中运行C ++程序

时间:2016-06-07 19:05:52

标签: c++ ruby-on-rails ruby

我对在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 ++程序,以便输出结果?

1 个答案:

答案 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系统。