Closed19

WSL2 Ubuntu 20.04でWindows用のバイナリをクロスコンパイルしたい

quasarquasar

--target-help は一見役立ちそうだが使い方が不明。
gccのマニュアルによると

Print (on the standard output) a description of target-specific command-line options for each tool. For some targets extra target-specific information may also be printed.

なので関係ない。

quasarquasar

適当にllvmのgitリポジトリを"windows"で検索してみたところ、syswindowsがありそう。というかwin32と書いてもwindowsになる。

$ clang -print-target-triple -target x86_64-unknown-win32-unknown
x86_64-unknown-windows-msvc

試してみる。

$ clang -target x86_64-unknown-windows-unknown   -fuse-ld=lld --rtlib=compiler-rt
lld-link: error: could not open '/usr/local/lib/clang/11.0.0/lib/windows/clang_rt.builtins-x86_64.lib': No such file or directory
lld-link: error: could not open 'libcmt.lib': No such file or directory

/usr/local/lib/clang/11.0.0/lib/windows がない。当たり前か。

quasarquasar

llvmのリポジトリを眺めていると、windowsに関してMinGW, Cygwinが有効であることがわかった。

$ clang -print-effective-triple -target x86_64-unknown-mingw-unknown
x86_64-unknown-windows-gnu
$ clang -print-effective-triple -target x86_64-unknown-cygwin-unknown
x86_64-unknown-windows-cygnus

MinGWが最も期待が高い。

$ clang -target x86_64-unknown-mingw-unknown -fuse-ld=lld --rtlib=compiler-rt
lld: error: unable to find library -lmingw32
lld: error: unable to find library -lmoldname
lld: error: unable to find library -lmingwex
lld: error: unable to find library -lmsvcrt
lld: error: unable to find library -ladvapi32
lld: error: unable to find library -lshell32
lld: error: unable to find library -luser32
lld: error: unable to find library -lkernel32
lld: error: unable to find library -lmingw32
lld: error: unable to find library -lmoldname
lld: error: unable to find library -lmingwex
lld: error: unable to find library -lmsvcrt
lld: error: unable to find library -lkernel32
quasarquasar
# apt install mingw-w64-x86-64-dev
$ clang -target x86_64-unknown-mingw-unknown -fuse-ld=lld --rtlib=compiler-rt -L/usr/x86_64-w64-mingw32/lib
lld-link: error: could not open '/usr/local/lib/clang/11.0.0/lib/windows/libclang_rt.builtins-x86_64.a': No such file or directory
quasarquasar
$ clang -target x86_64-unknown-mingw-unknown -fuse-ld=lld -L/usr/x86_64-w64-mingw32/lib
lld: error: unable to find library -lgcc
lld: error: unable to find library -lgcc_eh
# apt install gcc-mingw-w64-x86-64
$ clang -target x86_64-unknown-mingw-unknown -fuse-ld=lld -L/usr/x86_64-w64-mingw32/lib -L/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32

動いた。

quasarquasar

そう言えばここまでのソースは以下のように最低限。

int
main(void)
{
    return 0;
}
quasarquasar

次はこれ

#include <stdio.h>

int
main(void)
{
    (void)printf("Hello,World!\n");
    return 0;
}
quasarquasar
$ clang -target x86_64-unknown-mingw-unknown -fuse-ld=lld -L/usr/x86_64-w64-mingw32/lib -L/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32
fatal error: 'stdio.h' file not found

これはmingw-w64-x86-64-devに入っているので

$ clang -target x86_64-unknown-mingw-unknown -isystem /usr/x86_64-w64-mingw32/include -fuse-ld=lld -L/usr/x86_64-w64-mingw32/lib -L/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32
>helloworld.exe
Hello,World!

とりあえず成功。
コンパイラランタイムもclangにしたいな……

quasarquasar

こうすべきだったっぽい

$ clang -target x86_64-unknown-mingw-unknown --sysroot=/usr/x86_64-w64-mingw32 -fuse-ld=lld -L/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32
quasarquasar

あとやりたいこと: compiler-rtをWindows(MinGW)向けにクロスコンパイル

めんどいので後回しかな……

quasarquasar

llvm-mingw というのがある。これがあればmingw-w64-x86-64-devgcc-mingw-w64-x86-64も要らない。

clangのバージョンを合わせたllvm-mingw-<release>-ucrt-x86_64.zip を持ってきて展開。更に中の lib/clang/13.0.0/lib/windows をclangの同じ階層に持ってくる。

これにより

clang -target x86_64-unknown-mingw-unknown --sysroot=/path/to/llvm-mingw --rtlib=compiler-rt -fuse-ld=lld

で動く。

このスクラップは2022/04/03にクローズされました