KazApps / YaneuraOu

YaneuraOu is the World's Strongest Shogi engine(AI player) , WCSC29 1st winner , educational and USI compliant engine.
GNU General Public License v3.0
0 stars 0 forks source link

WSL上でAOCCコンパイラやIntelコンパイラを用いてWindows用バイナリ(YaneuraOu-by-gcc.exe)を生成する方法 #1

Closed mrt-tsk closed 1 month ago

mrt-tsk commented 2 months ago

WSL上でmingw-w64を用いて既存のgccやclangでやねうら王のWindows用バイナリを生成する方法については コンパイラとして/usr/bin/x86_64-w64-mingw32-g++-posixや~/llvm-mingw-20240619-ucrt-ubuntu-20.04-x86_64/bin/x86_64-w64-mingw32-g++を指定してビルドすることで解決できたように思います。 それぞれ動作に必要なdllをYaneuraOu-by-gcc.exeと同じ階層に置くことで無事動作確認できました。 ただ表題の方法については自力では結局わかりませんでした。 WSL上でAOCCコンパイラやIntelコンパイラを用いて、やねうら王のWindows用バイナリを生成する方法を教えていただけないでしょうか。

KazApps commented 2 months ago

色がついてればわかりやすいのですが…リンクのログから地道にerrorという文字を探せばいいでしょうか?

例えばWindows TerminalなどからWSLを使っている場合には、Ctrl+Shift+Fで検索ができます。

mrt-tsk commented 2 months ago

目が死にそうと思ってました笑 ありがとうございます。やってみます。

KazApps commented 2 months ago

後、さっき言い忘れてて申し訳ないんですが、symbols:から始まる行はおそらくエラーとは関係ないと思います。

mrt-tsk commented 2 months ago

そうだったんですね笑 具体的にどういうのがエラーとかってありますか?

mrt-tsk commented 2 months ago

こういうのはそうですか? ld.lld: Loaded libc++.a(stdexcept.cpp.obj) for std::runtime_error::runtime_error(char const*)

KazApps commented 2 months ago

そういうのは違いますね。 もしかするとログにはエラー含まれてないかもです。<( )>

KazApps commented 2 months ago

ちなみに

/opt/AMD/aocc-compiler-4.2.0/bin/ld.lld --verbose -m i386pep -Bstatic -o YaneuraOu-by-gcc.exe /usr/x86_64-w64-mingw32/lib/crt2.o /usr/x86_64-w64-mingw32/lib/crtbegin.o -L/usr/lib -L/mnt/c/msys64/mingw64/lib -L/opt/AMD/aocc-compiler-4.2.0/lib/ -L/usr/x86_64-w64-mingw32/lib -L/usr/x86_64-w64-mingw32/mingw/lib -L/opt/AMD/aocc-compiler-4.2.0/lib/clang/16/lib/windows ../obj/main.o ../obj/types.o ../obj/bitboard.o ../obj/misc.o ../obj/movegen.o ../obj/position.o ../obj/usi.o ../obj/usi_option.o ../obj/thread.o ../obj/tt.o ../obj/movepick.o ../obj/timeman.o ../obj/book/book.o ../obj/book/apery_book.o ../obj/extra/bitop.o ../obj/extra/long_effect.o ../obj/extra/sfen_packer.o ../obj/extra/super_sort.o ../obj/mate/mate.o ../obj/mate/mate1ply_without_effect.o ../obj/mate/mate1ply_with_effect.o ../obj/mate/mate_solver.o ../obj/eval/evaluate_bona_piece.o ../obj/eval/evaluate.o ../obj/eval/evaluate_io.o ../obj/eval/evaluate_mir_inv_tools.o ../obj/eval/material/evaluate_material.o ../obj/testcmd/unit_test.o ../obj/testcmd/mate_test_cmd.o ../obj/testcmd/normal_test_cmd.o ../obj/testcmd/benchmark.o ../obj/book/makebook.o ../obj/book/makebook2015.o ../obj/book/makebook2023.o ../obj/learn/learner.o ../obj/learn/learning_tools.o ../obj/learn/multi_think.o ../obj/eval/nnue/evaluate_nnue.o ../obj/eval/nnue/evaluate_nnue_learner.o ../obj/eval/nnue/nnue_test_command.o ../obj/eval/nnue/features/k.o ../obj/eval/nnue/features/p.o ../obj/eval/nnue/features/half_kp.o ../obj/eval/nnue/features/half_kp_vm.o ../obj/eval/nnue/features/half_relative_kp.o ../obj/eval/nnue/features/half_kpe9.o ../obj/eval/nnue/features/pe9.o ../obj/engine/yaneuraou-engine/yaneuraou-search.o -s -lpthread -lc++ -lc++abi --start-group -lmingw32 /opt/AMD/aocc-compiler-4.2.0/lib/clang/16/lib/windows/libclang_rt.builtins-x86_64.a -l:libunwind.a -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 --end-group /usr/x86_64-w64-mingw32/lib/crtend.o

これだと、

ld.lld: error: undefined symbol: std::__1::basic_streambuf<char, std::__1::char_traits<char>>::seekpos(std::__1::fpos<int>, unsigned int)
>>> referenced by misc.cpp
>>>               ../obj/misc.o
>>> referenced by eval/nnue/evaluate_nnue.cpp
>>>               ../obj/eval/nnue/evaluate_nnue.o

ld.lld: error: undefined symbol: std::__1::codecvt<char, char, int>::id
>>> referenced by misc.cpp
>>>               ../obj/misc.o
>>> referenced by book/book.cpp
>>>               ../obj/book/book.o
>>> referenced by book/apery_book.cpp
>>>               ../obj/book/apery_book.o
>>> referenced 3 more times

ここら辺のエラーが出なくなったりしませんか。

KazApps commented 2 months ago

後もしかすると、このサイトによると、何かしら環境が壊れている可能性もあるのかもしれません。

mrt-tsk commented 2 months ago

出ますね。

mrt-tsk commented 2 months ago

いや~壊れてるとなると、ubuntuを再インストールしないとダメそうですね

mrt-tsk commented 2 months ago

色々インストールしてるので、それはあるかもしれません。

KazApps commented 2 months ago

msysの方でもう1度libc++入れなおしてもらえませんか。

pacman -S mingw-w64-clang-x86_64-libc++ mingw-w64-x86_64-libc++

これによって改善されるとも思えないですけど...

mrt-tsk commented 2 months ago

いや~同じエラーです。

mrt-tsk commented 2 months ago

問題があるとしたら、WSL側なのか、msys側なのかどっちだと思いますか?

KazApps commented 2 months ago

参照しているlibc++に問題がありそうなんで、msysの方なんですかね... とはいえnm -a /mingw64/lib/libmingw32.a | grep mingw_app_typeした時の出力とかは正常ですし... 謎です。

KazApps commented 2 months ago

現状libc++の問題とmingw系のものが見つからない問題の2つあってどっちもよくわからないという感じですね。

mrt-tsk commented 2 months ago

そうか~謎ですね。 一度WSL側を再インストールしてもう一度やってみようと思いますが、できると思いますか?

mrt-tsk commented 2 months ago

issue立てる前に色々インストールしたりビルドしたりしてたので、内部でなにかしらの競合が起きてる可能性はあると思います。

KazApps commented 2 months ago

Ubuntuを再インストールする前に、aptをリセットしてみるのがよいかとは思います。あとmsysのpacmanの方もリセットしてからそれぞれのパッケージを入れなおしてみてはいかがでしょうか。

mrt-tsk commented 2 months ago

なるほど!消さずにリセットできるならそのほうがいいですね。やってみます! 長時間とても丁寧に対応していただき感謝しかありません。ありがとうございます。 のちほど、また連絡しますm(-_-)m

KazApps commented 2 months ago

ビルドがうまくいくことを願っています! また何かあればご連絡ください。

mrt-tsk commented 2 months ago

ありがとうございます! その時はよろしくお願いします。

mrt-tsk commented 2 months ago

困りました。結局どちらも再インストールしてやってみましたが、エラーが出ます。

make clean tournament COMPILER=/opt/AMD/aocc-compiler-4.2.0/bin/clang++ EXTRA_CPPFLAGS="-stdlib=libc++ -target x86_64-w64-mingw32 -I/usr/include/mingw-w64 -static -pthread" EXTRA_LDFLAGS="-rtlib=compiler-rt -unwindlib=libunwind -L/usr/lib -L/mnt/c/msys64/mingw64/lib -L/opt/AMD/aocc-compiler-4.2.0/lib/" -j 8 実行時です。 下のほうは、同じエラーですね。

ld.lld: error: undefined symbol: __stdio_common_vsscanf

referenced by libc++.a(locale.cpp.obj):(_sscanf_l)

ld.lld: error: undefined symbol: __declspec(dllimport) _strftime_l

referenced by libc++.a(locale.cpp.obj):(std::1::time_put<char, std::__1::ostreambuf_iterator<char, std::1::char_traits>>::do_put(std::1::ostreambuf_iterator<char, std::__1::char_traits>, std::1::ios_base&, char, tm const, char, char) const) referenced by libc++.a(locale.cpp.obj):(std::1::time_put::__do_put(char, char&, tm const, char, char) const) referenced by libc++.a(locale.cpp.obj):(std::1::time_put::__do_put(wchar_t, wchar_t&, tm const*, char, char) const) referenced 6 more times

ld.lld: error: undefined symbol: std::1::basic_streambuf<char, std::__1::char_traits>::seekpos(std::1::fpos, unsigned int)

referenced by misc.cpp ../obj/misc.o referenced by eval/nnue/evaluate_nnue.cpp ../obj/eval/nnue/evaluate_nnue.o

ld.lld: error: undefined symbol: std::__1::codecvt<char, char, int>::id

referenced by misc.cpp ../obj/misc.o referenced by book/book.cpp ../obj/book/book.o referenced by book/apery_book.cpp ../obj/book/apery_book.o referenced 3 more times clang-16: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: [Makefile:656: YaneuraOu-by-gcc] Error 1 make[1]: Leaving directory '/home/mrttsk/YaneuraOu/source' make: [Makefile:690: tournament] Error 2

mrt-tsk commented 2 months ago

意味があるかはわかりませんが… make clean tournament COMPILER=/opt/AMD/aocc-compiler-4.2.0/bin/clang++ EXTRA_CPPFLAGS="-stdlib=libc++ -target x86_64-w64-mingw32 -pthread" EXTRA_LDFLAGS="-rtlib=compiler-rt -unwindlib=libunwind -L/mnt/c/msys64/mingw64/lib" -j8 でビルドすると、(-staticを消してみました。)上2つのエラーは減りました。

ld.lld: error: undefined symbol: std::1::basic_streambuf<char, std::__1::char_traits>::seekpos(std::1::fpos, unsigned int)

referenced by misc.cpp ../obj/misc.o referenced by eval/nnue/evaluate_nnue.cpp ../obj/eval/nnue/evaluate_nnue.o

ld.lld: error: undefined symbol: std::__1::codecvt<char, char, int>::id

referenced by misc.cpp ../obj/misc.o referenced by book/book.cpp ../obj/book/book.o referenced by book/apery_book.cpp ../obj/book/apery_book.o referenced 3 more times clang-16: error: linker command failed with exit code 1 (use -v to see invocation)

KazApps commented 2 months ago

対応が遅くなってしまい申し訳ありません。

意味があるかはわかりませんが… make clean tournament COMPILER=/opt/AMD/aocc-compiler-4.2.0/bin/clang++ EXTRA_CPPFLAGS="-stdlib=libc++ -target x86_64-w64-mingw32 -pthread" EXTRA_LDFLAGS="-rtlib=compiler-rt -unwindlib=libunwind -L/mnt/c/msys64/mingw64/lib" -j8 でビルドすると、(-staticを消してみました。)上2つのエラーは減りました。

これに関してリンク時にシンボルを解決することを実行時に遅らせてることになるので、根本的な解決ではないうえに速度は落ちると思われます(大差はないかもしれませんが)。

KazApps commented 2 months ago

libc++が適切にリンクできていないようなので、以下のように直接ファイルを指定してみたらどうなるか試していただけないでしょうか。

make clean tournament COMPILER=/opt/AMD/aocc-compiler-4.2.0/bin/clang++ EXTRA_CPPFLAGS="-stdlib=libc++ -target x86_64-w64-mingw32 -I/usr/include/mingw-w64 -static -pthread" EXTRA_LDFLAGS="-rtlib=compiler-rt -unwindlib=libunwind -L/usr/lib -L/mnt/c/msys64/mingw64/lib -L/opt/AMD/aocc-compiler-4.2.0/lib/ /mnt/c/msys64/mingw64/lib/libc++.a /mnt/c/msys64/mingw64/lib/libc++abi.a" -j 8
mrt-tsk commented 2 months ago

返信ありがとうございます。 う~ん、なるほど… 早速試してみましたが、同じエラーでした。 一応聞きたいのですが、/usr/include/c++/v1ってファイル形式はフォルダですか? 最初入っていたのは中身がないファイルみたいな感じだったので、これは機能してないなと考えて、それを消して/opt/AMD/aocc-compiler-4.2.0/include/c++/v1のディレクトリをコピーしたので、関係はなさそうといえどうなのかなと あとmsysでlibc++関連のダウンロードしたときになぜかmnt/c/msys/clang64/libのほうに入ってたりしてて、それはmingw64/libにコピーしたので大丈夫だとは思うのですが… インストールの段階で何か問題が生じる可能性はありますか?

KazApps commented 2 months ago

一応聞きたいのですが、/usr/include/c++/v1ってファイル形式はフォルダですか?

ディレクトリへのリンクですかね。エクスプローラーから見るとファイルかのように見えるとは思いますが。 __stdio_common_vsscanfってたぶんMSVC関連のものだと思うのでmsvcrtのリンク関係で問題が発生してそうですね。あと、相変わらずlibc++の方も正しくリンクできてないですね。

mrt-tsk commented 2 months ago

そうか~リンクの一部を消してたってことになるんですね。 根本的な原因の可能性が高いか…

KazApps commented 2 months ago

でも現状リンクで問題が発生していて、そのリンクしているファイルはmsys側なので、あまり問題ではなさそうな気はします。 ただ、全くないと断言はできないです。

mrt-tsk commented 2 months ago

すみません。確認してから消すべきでした。 戻す方法はないですよね… msys側で対処できればいいのですが。

KazApps commented 2 months ago

libc++関係のaptのパッケージをすべて消して入れなおすとかしたら戻せるとは思います。

mrt-tsk commented 2 months ago

良かった~復活しました。

mrt-tsk commented 2 months ago

とはいえ同じエラーが出ますね… となると、やっぱりmsys側のlibc++へのリンクが問題ですか。

mrt-tsk commented 2 months ago

v1戻らないかと思い、焦りました。ありがとうございます。

KazApps commented 2 months ago

となると、やっぱりmsys側のlibc++へのリンクが問題ですか。

そうですね。さらに言えば、MSVC関係のリンクもうまくいっていないのが気になりますね。そこは一旦-staticなしでビルドして足りないdllファイルをexeファイルと同じディレクトリに配置するとかで対応することも可能ですが。

mrt-tsk commented 2 months ago

たしかに、速度が大きく落ちないなら… とりあえず、下2つのエラーを解決できれば動かせそうですか。

KazApps commented 2 months ago

以前は下記のコマンドを実行したときに、

/opt/AMD/aocc-compiler-4.2.0/bin/clang++ -E -x c++ -stdlib=libc++ -target x86_64-w64-mingw32 -static - -v < /dev/null

/usr/include/c++/v1は含まれていないとおっしゃっていましたが、今は存在していますか。

KazApps commented 2 months ago

たしかに、速度が大きく落ちないなら… とりあえず、下2つのエラーを解決できれば動かせそうですか。

おそらく下2つのエラーを修正できたらあとは簡単な気がします。

mrt-tsk commented 2 months ago

存在してます。libc++関連の再インストールしたら最初の状態に戻せました。 clang -cc1 version 16.0.3 based upon LLVM Mirror.Version.16.0.3 default target x86_64-unknown-linux-gnu ignoring nonexistent directory "/usr/x86_64-w64-mingw32/include/c++/v1" ignoring nonexistent directory "/usr/x86_64-w64-mingw32/usr/include"

include "..." search starts here:

include <...> search starts here:

/usr/include/c++/v1 /opt/AMD/aocc-compiler-4.2.0/lib/clang/16/include /usr/x86_64-w64-mingw32/include End of search list.

KazApps commented 2 months ago

下2つのみがlibc++の原因だと思います。 std::__1::~みたいなのが含まれてるものがlibc++が絡んだエラーです。

mrt-tsk commented 2 months ago

なるほど、そこを見ればいいんですね。 調べるとlibc++関連とは出てきますが、どう見分けるのかがわかりませんでした。

mrt-tsk commented 2 months ago

libc++関連のAファイルをmnt/c/msys64/mingw64/lib/からWSL側/usr/x86_64-w64-mingw32/libにコピーして-Lで指定してビルドするのはどうかなと考え、ビルドしてみましたが解決できず...

mrt-tsk commented 2 months ago

やっぱりどうもうまく参照してくれない気がします。

KazApps commented 2 months ago

リンカのログを見る限り、参照自体はしているみたいですけどね。 ほとんどのシンボルは正常に解決できているんですけど、一部のシンボルのみなぜかリンクできていないという状態ですね。

ld.lld: error: undefined symbol: std::__1::basic_streambuf<char, std::__1::char_traits>::seekpos(std::__1::fpos, unsigned int)
>> referenced by misc.cpp
../obj/misc.o
>> referenced by eval/nnue/evaluate_nnue.cpp
../obj/eval/nnue/evaluate_nnue.o

ld.lld: error: undefined symbol: std::__1::codecvt<char, char, int>::id
>> referenced by misc.cpp
../obj/misc.o
>> referenced by book/book.cpp
../obj/book/book.o
>> referenced by book/apery_book.cpp
../obj/book/apery_book.o
referenced 3 more times

上記のエラーを見る限り、解決できていないシンボルは2つだけみたいですけど、普通libc++が正しくリンクできていないときは大量に未解決のシンボルが出てくるはずです。なぜその2つのみシンボルが解決できないのか不思議です。

mrt-tsk commented 2 months ago

特定の箇所だけなのは珍しいんですね… ノートPCの方でも同じ手順でビルドしてみたのですが、やはり同じエラーでした。

KazApps commented 2 months ago

何かパッケージが足りてないんですかね。 パッケージをこちらの環境と合わせてもらうため、 aptのパッケージのリストpacmanのパッケージのリスト をダウンロードして、 aptの方は、

sudo dpkg --set-selections < package-list.txt
sudo apt-get dselect-upgrade

pacmanの方は、

sudo pacman -Syu --needed - < package-list.txt

でインストールしてみて再ビルドしてみてもらえませんか。

mrt-tsk commented 2 months ago

ありがとうございます!pacmanはうまくいったと思いますが sudo dpkg --set-selections < package-list.txtがなぜか-bash: package-list.txt: No such file or directoryで跳ね返されてしまうのですが、どうしたらいいでしょうか。

KazApps commented 2 months ago

aptのパッケージのリストをダウンロードしたディレクトリで、sudo dpkg --set-selections < ./package-list.txtとしてみたらどうですか。

mrt-tsk commented 2 months ago

普通にダウンロードして、wsl上のディレクトリにコピーして置いても問題はないですよね。 それでコピーしたpackage-list.txtのあるディレクトリで実行したのですが、先ほどのエラーが出ます。 sudo dpkg --set-selections < ./package-list.txtも同様でした…