はじめに
初めに、本記事のタイトルが@freegod(とり 火鳥)様のev3rtでno implicit conversion of Hash into String (TypeError)と出た時の備忘録という記事と似ていることをお知らせいたします。
本記事では、上記の記事とは異なるアプローチで、当該エラーを解決するものになります。
(私の環境下では、上記の記事の方法では解決しませんでした…)
条件
- 実施日: 2023年8月
- 実行環境: Windows 10 および 11上のWSL2
- EV3rtのバージョン: 1.1
環境構築は、私の以前の記事#2 Windows(WSL)版開発環境構築【後輩たちのためのEV3rt講座(改)】に沿って行われたものとします。
症状
TOPPERSのEV3rtにて、アプリケーションのコンパイルをmake app=アプリケーション名
により実行したところ、以下のようなエラーが発生します。
XXXX@XXXX:/mnt/c/workspace/ev3rt/hrp3/sdk/workspace$ make app=helloev3
rm -rf /mnt/c/workspace/ev3rt/hrp3/sdk/workspace/.././OBJ/
Generating Makefile from ../common/Makefile.app.
make[1]: Entering directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
rm -f cfg1_out cfg1_out.o cfg1_out.c cfg1_out.syms cfg1_out.srec module_cfg.h module_cfg.c \#* *~ *.o
make[1]: Leaving directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
make[1]: Entering directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
CFG[1] module_cfg.h
/usr/lib/ruby/3.0.0/csv.rb:1421:in `initialize': no implicit conversion of Hash into String (TypeError)
from /usr/lib/ruby/3.0.0/csv.rb:1421:in `open'
from /usr/lib/ruby/3.0.0/csv.rb:1421:in `open'
from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:178:in `block in ReadSymvalTable'
from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:172:in `each'
from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:172:in `ReadSymvalTable'
from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:902:in `Pass1'
from ../../cfg/cfg.rb:705:in `<main>'
make[1]: *** [../../target/ev3_gcc/dmloader/app/Makefile.lum:52: module_cfg.h] Error 1
make[1]: Leaving directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
make: *** [../common/Makefile.workspace:97: app] Error 2
エラーの発生個所を見ると
/usr/lib/ruby/3.0.0/csv.rb:1421:in `initialize': no implicit conversion of Hash into String (TypeError)
となっており、当該ファイルを確認したところ、1421行目のopen
という関数が悪さをしているようです。
結論
結論としては、rubyのバージョンが3.0
系になっていることが原因と考えられます。
以下のコマンドにより、現在インストールされているrubyのバージョンが確認出来ます。
XXXX@XXXX:~$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux-gnu]
このように、ruby 3.0.2
がインストールされていることが確認できます。
よって、以下の手順によりrubyのバージョンを2.7
系にダウングレードします。
解決方法
ruby の削除
初めに、現時点でインストールされているrubyをアンインストールします。
XXXX@XXXX:~$ sudo apt purge ruby
これにより、先ほどのバージョン確認コマンドを入力しても、バージョンが出力されないはずです。
XXXX@XXXX:~$ ruby -v
Command 'ruby' not found, but can be installed with:
sudo snap install ruby # version 3.2.2, or
sudo apt install ruby # version 1:3.0~exp1
See 'snap info ruby' for additional versions.
ruby 2.7系のインストール
こちらの記事を参考にruby 2.7をインストールしていきます。
依存関係のインストール
$ sudo apt install git build-essential checkinstall zlib1g-dev
rbenvのインストール
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
rbenvのパスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
ruby-buildのインストール
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
OpenSSL 1.1.1のインストール
$ cd
$ wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz
$ tar xf openssl-1.1.1q.tar.gz
$ cd openssl-1.1.1q
$ ./config --prefix=/opt/openssl-1.1.1q --openssldir=/opt/openssl-1.1.1q shared zlib
$ make
$ make test
$ sudo make install
シンボリックリンクを張り替える
$ sudo rm -rf /opt/openssl-1.1.1q/certs
$ sudo ln -s /etc/ssl/certs /opt/openssl-1.1.1q
ruby 2.7.6をインストール
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q rbenv install 2.7.6
$ rbenv global 2.7.6
インストールされていることを確認
$ ruby -v
ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-linux]
パスを通す
初めに、rubyの場所を確認します。
$ which ruby
/home/user/.rbenv/shims/ruby
出力された/home/user/.rbenv/shims/ruby
をコピーします。
次に、以下の操作により、パスを通します。
$ sudo su -
$ echo "export PATH=$PATH:/home/user1/.rbenv/shims" >> ~/.bashrc
$ source ~/.bashrc
ここまでで、ruby 2.7のインストールは完了です。
shell のインストール
EV3rtのコンパイル時に、rubyのスクリプトで用いるshell
というライブラリが必要なため、以下のコマンドによりインストールします。
$ gem install shell
コンパイルの確認
workspaceフォルダに移動し、アプリケーションがコンパイル出来るか確認します。
$ make app=helloev3
workspace
フォルダにapp
ファイルが出来ていれば、コンパイル完了です。