В настоящее время я работаю над способом привязки интерпретатора M ruby к проектам Crystal. Однако мой текущий код не работает на Windows (при отличной работе на WSL Ubuntu) с 64-битной средой Visual Studio, и я не нахожу решения проблемы.
Все компилируется нормально, и сама программа работает, но как только я выполняю команду Ruby, происходит сбой (для сборок отладки и выпуска) с нарушением прав доступа.
@[Link(ldflags: "#{__DIR__}/build/lib/libmruby.lib msvcrt.lib Ws2_32.lib")] # Link mruby and standard library
lib Mruby # Generate bindings
type MrbState = Void
fun mrb_open() : MrbState*
fun mrb_close(mrb : MrbState*)
fun mrb_load_string(mrb : MrbState*, s : LibC::Char*)
end
mrb = Mruby.mrb_open() # Load context, works fine
Mruby.mrb_load_string(mrb, "puts 123") # This crashes the program
Mruby.mrb_close(mrb) # Close context again, would also work fine without the line above
puts "Everything okay" # Does not show
Для компиляции кода Crystal я написал пакетный сценарий:
set CRYSTAL_PATH=%CD%\third_party\crystal\src;%CD%\third_party
set PATH=%PATH%;%CD%\third_party\crystal
set LIB=%LIB%;%CD%\third_party\crystal
cd third_party/mruby
ruby minirake MRUBY_BUILD_DIR="../../build" MRUBY_CONFIG="../../mruby_build_config.rb"
cd ../..
crystal build test.cr -o test.exe
Исходные коды для Crystal и M ruby находятся в каталоге third_party
, в папках crystal
и mruby
соответственно. Ссылки на репозитории:
https://github.com/mruby/mruby и https://github.com/crystal-lang/crystal
Бинарные файлы Crystal получены из скриптов Github CI для Windows и были только что скопированы в каталог Crystal.
Файл конфигурации для M ruby просто:
MRuby::Build.new do |conf|
if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
toolchain :visualcpp
else
toolchain :gcc
end
conf.gembox 'default'
conf.build_dir = ENV["MRUBY_BUILD_DIR"] || raise("MRUBY_BUILD_DIR undefined!")
end
Та же программа, написанная в C, работает, поэтому проблема похоже, как-то связано с Crystal:
#include <mruby.h>
#include <mruby/compile.h>
int main() {
mrb_state* mrb = mrb_open();
mrb_load_string(mrb, "puts 123");
mrb_close(mrb);
return 0;
}
Программа C была скомпилирована с использованием следующей строки:
cl main.c /I third_party/mruby/include msvcrt.lib Ws2_32.lib build/lib/libmruby.lib
Я пытался отладить программу с помощью Visual Studio, но отладчик не совместим с кодом, созданным Crystal. Изменение флагов и определений компилятора тоже не помогло.
Я действительно понятия не имею, в чем проблема, и не знаю, как исправить это или как выяснить, что ее вызывает.