てすと

たかろぐ

自分のログを刻みます。

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って何じゃ!?と思いつつ調べる。 そして、それっぽいのは見つけました。

"compiler-rt" Runtime Library

でも、この辺りで、ちょっと疲れちゃったので、一旦ストップ。 (なんか方針違うことに気が付いたら、そっと教えてくださいますと泣いて喜びます!)

気分転換に、React Nativeからネイティブモジュールを呼び出す方法を試していました。(こっちは何とかできました!) が、長くなるので記事にまとめるのは今度にします。

3日後くらいには、nimとReact Nativeの連携が取れるように頑張っていきたいです! おやすみなさいzzz