Вызов функций библиотеки M ruby в Crystal segfaults в среде MSV C - PullRequest
0 голосов
/ 07 августа 2020

В настоящее время я работаю над способом привязки интерпретатора 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. Изменение флагов и определений компилятора тоже не помогло.

Я действительно понятия не имею, в чем проблема, и не знаю, как исправить это или как выяснить, что ее вызывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...