我将 ruby 版本 2.1.2 嵌入到 wxWidgets 应用程序中,在 Windows 上编译并定位。链接到 msvcrt-ruby210.dll 并调用
ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
足以让我使用基本的 VM 和内置类运行。但是,我还将标准库与我的应用程序打包在一起,因为我打算从我的应用程序中使用 FileUtils 和 Resolv 等工具。我可以require
并且很好地使用一些库,但是当我require 'resolv'
收到错误报告时unitialized constant Encoding::UTF_16LE
。在 ruby.c 中进行了一些谷歌搜索和挖掘之后,我发现我可以使用以下初始化代码来解决这个问题......
ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
rb_enc_find_index("encdb");
这清除了先前的错误,但给我留下了code converter not found (UTF-8 to UTF-16LE)
. 这可以通过添加一行来解决rb_eval_string("require 'enc/trans/transdb'");
,但是,我不想逐个复制 rubyruby_options
函数执行的初始化代码,所以我尝试直接使用它,就像在 ruby 自己的main
函数中一样......
int my_argc = 2;
char* arg1 = "myapp.exe";
char* arg2 = "scripts/bootstrap.rb";
char** my_argv = new char*[2]{arg1, arg2};
ruby_sysinit(&my_argc, &my_argv);
RUBY_INIT_STACK;
ruby_init();
ruby_run_node(ruby_options(my_argc, my_argv));
但是,这仅在我使用myapp.exe scripts/bootstrap.rb
. 似乎 ruby 忽略了我的参数ruby_options
并使用系统提供的 argc 和 argv 值(显然在 Windows 上这种情况已经有一段时间了)。这很麻烦,因为我希望我的应用程序只需双击可执行文件即可运行,并且不需要用户提供指示“引导”脚本位置的命令行参数。
那么,在这种情况下,是否有一个方便的 API 或一些咒语可以用来初始化 ruby,而不需要命令行参数?
请注意,如果可能的话,我希望避免将我的应用程序打包为 ruby 扩展。