【发布时间】:2014-08-22 14:13:20
【问题描述】:
我正在将 ruby 版本 2.1.2 嵌入到 wxWidgets 应用程序中,在 Windows 上编译 - 并以 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'"); 来解决,但是,我不想逐个复制 ruby 的 ruby_options 函数执行的初始化代码,所以我尝试直接使用它,就像在 ruby 自己的 @ 987654330@函数...
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 (Apparently this has been the case for some time on Windows) 值。这很麻烦,因为我希望我的应用程序只需双击可执行文件即可运行,并且不需要用户提供指示“引导”脚本位置的命令行参数。
那么,在这种情况下,我可以使用方便的 API 或一些咒语来初始化 ruby,而无需命令行参数吗?
请注意,如果可能的话,我希望避免将我的应用程序打包为 ruby 扩展。
【问题讨论】:
标签: ruby embedded-ruby ruby-c-extension