NimライブラリをReact Nativeから使いたい(調査編2)
今日も一日お疲れ様でした〜!
僕は、今日もNimとReact Nativeを連携させる戦いをしてました。
Nimのクロスコンパイル
これ、今すごく苦労しています...orz
昨日載せた記事(これ)を見て、内容を変えていきつつやる方針でやっていたのですが、結構ハマっています。
nimでクロスコンパイルする時、オプションでCPUとOSを指定して実行するのですが、どう指定すれば良いかが分かっていません。(ムズカシイネ!)
勿論ドキュメントを覗きに行ったんですけど、「指定できるリスト」的なものが見つからなくて困っていたりしています。
まぁそれでも、取り敢えず感覚は掴めたらいいなと思って、linux向けにクロスコンパイルを試みました。 設定ファイルに、
# nim.cfg(nimでコンパイルする時の設定ファイル) arm64.linux.gcc.path = "/usr/bin/" arm64.linux.gcc.exe = "gcc" arm64.linux.gcc.linkerexe = "gcc"
って書いて、取り敢えず$ nim c --cpu:arm64 --os:linux --compileOnly src/main
で実行!
すると、 Nim言語で書いたコードがC言語に変換され、以下の内容のシェルファイルも生成されました。
# compile_main.sh gcc -c -w -o main.o main.c gcc -c -w -o stdlib_system.o stdlib_system.c gcc -c -w -o stdlib_os.o stdlib_os.c gcc -c -w -o stdlib_strutils.o stdlib_strutils.c gcc -c -w -o stdlib_parseutils.o stdlib_parseutils.c gcc -c -w -o stdlib_math.o stdlib_math.c gcc -c -w -o stdlib_algorithm.o stdlib_algorithm.c gcc -c -w -o stdlib_times.o stdlib_times.c gcc -c -w -o stdlib_posix.o stdlib_posix.c gcc -c -w -o stdlib_ospaths.o stdlib_ospaths.c gcc -c -w -o stdlib_parseopt2.o stdlib_parseopt2.c gcc -c -w -o game.o game.c gcc -c -w -o core.o core.c gcc -c -w -o command_line.o command_line.c gcc -c -w -o stdlib_strformat.o stdlib_strformat.c gcc -c -w -o stdlib_macros.o stdlib_macros.c gcc -c -w -o stdlib_unicode.o stdlib_unicode.c gcc -c -w -o ai.o ai.c gcc -c -w -o searchResult.o searchResult.c gcc -c -w -o evaluate.o evaluate.c gcc -c -w -o aiConfig.o aiConfig.c gcc -o main main.o stdlib_system.o stdlib_os.o stdlib_strutils.o stdlib_parseutils.o stdlib_math.o stdlib_algorithm.o stdlib_times.o stdlib_posix.o stdlib_ospaths.o stdlib_parseopt2.o game.o core.o command_line.o stdlib_strformat.o stdlib_macros.o stdlib_unicode.o ai.o searchResult.o evaluate.o aiConfig.o -lm -lrt -ldl
"main.c"、"core.c"、"ai.c"といったファイルは、自分で書いたやつで、"std〜"系はnimの標準ライブラリだと思います。
やっていることは簡単で、それぞれのCファイルをオブジェクトファイルに変換し、 最後にまとめて実行バイナリを作ることをするスクリプトです。
ほほ〜と思って、取り敢えずsh compile_main.sh
実行!
そしたら、次のようなエラーが...!
main.c:7:10: fatal error: 'nimbase.h' file not found #include "nimbase.h" ^~~~~~~~~~~ 1 error generated. stdlib_system.c:7:10: fatal error: 'nimbase.h' file not found #include "nimbase.h" ^~~~~~~~~~~ 1 error generated. stdlib_os.c:7:10: fatal error: 'nimbase.h' file not found #include "nimbase.h" ^~~~~~~~~~~ 1 error generated. stdlib_strutils.c:7:10: fatal error: 'nimbase.h' file not found #include "nimbase.h" ...(もっと続く!)
どうやら、コンパイルするのに"nimbase.h"というファイルが必要みたいですね。
もうこの辺からよく分からなくなってましたが、{nimへのパス}/nim-0.18.0/c_code/nimbase.h
というファイルを見つけたので、
これをコピーして持ってきて、もう一度sh compile_main.sh
実行!
そしたら、またしてもエラーががが...orz
ld: library not found for -lrt
clang: error: linker command failed with exit code 1 (use -v to see invocation)
今度は、「rtというライブラリが無いので、リンクできません」みたいな内容ですね。 rtって何じゃ!?と思いつつ調べる。 そして、それっぽいのは見つけました。
でも、この辺りで、ちょっと疲れちゃったので、一旦ストップ。 (なんか方針違うことに気が付いたら、そっと教えてくださいますと泣いて喜びます!)
気分転換に、React Nativeからネイティブモジュールを呼び出す方法を試していました。(こっちは何とかできました!) が、長くなるので記事にまとめるのは今度にします。
3日後くらいには、nimとReact Nativeの連携が取れるように頑張っていきたいです! おやすみなさいzzz