使用 docker 进行 QEMU W64 的交叉编译

本文记录在 Debian 12 上利用 docker 进行 QEMU W64 的交叉编译步骤

安装 docker 编译环境

首先,在Debian 12系统中通过以下命令可以安装Docker: sudo apt update sudo apt install docker.io 启动Docker服务: sudo systemctl start docker 在 docker 新目录中创建 Dockerfile 文件 # 便用Debian 12作为基础镜像 FROM debian:12 # 设置工作目录 WORKDIR /app # 更新apt源为国内镜像 RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources #、安装软件包 RUN apt update

配置 docker 运行环境

首先配置 docker.io 的 registry 镜像,新建 /etc/docker/daemon.json 文件,内容如下: { "registry-mirrors": ["https://docker.1panel.dev"] } 以上表示 docker daemon 使用 1panel.dev 的 docker 镜像 然后在 docker 新目录中运行以下命令: docker build ./ docker 根据目录中的 Dockerfile 指令构建运行环境

准备 QEMU W64 编译环境

首先运行 docker 镜像,执行以下命令: docker run --name qemu-w64 -it -d -v --rm debian:12 bash 然后,接入 docker 容器的控制台,执行以下命令: docker attach qemu-w64 接下来安装交叉编译 QEMU W64 所需要的工具 apt update apt install -y vim curl apt install -y git ninja-build iasl bzip2 meson apt install -y g++-mingw-w64 mingw-w64 mingw-w64-tools mingw-w64-x86-64-dev nsis mono-devel apt install -y python3 python3-venv python3-sphinx python3-msmb-theme 然后下载安装 msys2 的 mingw64 软件包 apt install -y pacman-package-manager pacman -Sy 1、 pacman -Syu 2、 pacman -Su 3、可选,基本编译工具,在 debian cross compile 中不需要 pacman -Sy --noconfirm base-devel mingw-w64-x86_64-toolchain git python ninja python-setuptools pacman -Sy --noconfirm msys2-w32api-runtime pacman -Sy --noconfirm base-devel mingw-w64-x86_64-toolchain git python ninja cd /mingw64/bin cp x86_64-w64-mingw32-gcc-ar.exe x86_64-w64-mingw32-ar.exe cp x86_64-w64-mingw32-gcc-nm.exe x86_64-w64-mingw32-nm.exe cp x86_64-w64-mingw32-gcc-ranlib.exe x86_64-w64-mingw32-ranlib.exe cp widl.exe x86_64-w64-mingw32-widl.exe cp windmc.exe x86_64-w64-mingw32-windmc.exe cp windres.exe x86_64-w64-mingw32-windres.exe 4、基本库 pacman -Sy --noconfirm mingw-w64-x86_64-glib2 pacman -Sy --noconfirm mingw-w64-x86_64-pixman pacman -Sy --noconfirm mingw-w64-x86_64-ncurses 5、GTK,SDL和SLiRP支持 pacman -Sy --noconfirm mingw-w64-x86_64-gtk3 pacman -Sy --noconfirm mingw-w64-x86_64-SDL2 pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_gfx pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_image pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_mixer pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_net pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_pango pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_sound pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_ttf pacman -Sy --noconfirm mingw-w64-x86_64-libslirp 6、SPICE和QXL支持 pacman -Sy --noconfirm mingw-w64-x86_64-spice-protocol pacman -Sy --noconfirm mingw-w64-x86_64-spice 7、OpenGL支持 pacman -Sy --noconfirm mingw-w64-x86_64-virglrenderer pacman -Sy --noconfirm mingw-w64-x86_64-libepoxy 8、capstone支持 pacman -Sy --noconfirm mingw-w64-x86_64-capstone 9、libssh支持 pacman -Sy --noconfirm mingw-w64-x86_64-libssh 10、libusb支持 pacman -Sy --noconfirm mingw-w64-x86_64-libusb pacman -Sy --noconfirm mingw-w64-x86_64-libusb-win32 11、pthread支持 pacman -Sy --noconfirm mingw-w64-x86_64-libwinpthread-git pacman -Sy --noconfirm mingw-w64-x86_64-winpthreads-git 12、document支持 pacman -Syu --noconfirm mingw-w64-x86_64-python-sphinx pacman -Syu --noconfirm mingw-w64-x86_64-python-sphinx_rtd_theme 13、JACK支持 pacman -Syu --noconfirm mingw-w64-x86_64-jack2 14、USB net redir支持 pacman -Syu --noconfirm mingw-w64-x86_64-usbredir 15、SASL支持 pacman -Syu --noconfirm mingw-w64-x86_64-cyrus-sasl 16、libcbor支持 pacman -Syu --noconfirm mingw-w64-x86_64-libcbor 17、snappy支持 pacman -Syu --noconfirm mingw-w64-x86_64-snappy 18、libnfs支持 pacman -Syu --noconfirm mingw-w64-x86_64-libnfs 19、nettle支持 pacman -Syu --noconfirm mingw-w64-x86_64-nettle 20、libgcrypt支持 pacman -Syu --noconfirm mingw-w64-x86_64-libgcrypt 21、dtc支持 pacman -Syu --noconfirm mingw-w64-x86_64-dtc 8、设置 pkgconfig 环境变量 export PKG_CONFIG_PATH="/mingw64/share/pkgconfig/:/mingw64/lib/pkgconfig/:$PKG_CONFIG_PATH" export PKG_CONFIG_LIBDIR="/mingw64/lib/pkgconfig/:$PKG_CONFIG_LIBDIR" export PKG_CONFIG_SYSROOT_DIR="" 9、编译 ./configure --cross-prefix=x86_64-w64-mingw32- --extra-cflags="-I/mingw64/include" --extra-cxxflags="-I/mingw64/include" --extra-ldflags="-L/mingw64/lib" --enable-gtk --enable-sdl --enable-opengl --enable-virglrenderer --enable-slirp --enable-nettle --enable-gnutls --enable-rng-none --enable-debug ./configure --cross-prefix=x86_64-w64-mingw32- --extra-cflags="-I/mingw64/include -D__MINGW32__ -D_FORTIFY_SOURCE=1 -D__OPTIMIZE__=0 -D__clang_major__=0 -D__clang_minor__=0" --extra-cxxflags="-I/mingw64/include -D__cplusplus=201103L" --extra-ldflags="-L/mingw64/lib" --enable-gtk --enable-sdl --enable-opengl --enable-virglrenderer --enable-slirp --enable-nettle --enable-gnutls --enable-rng-none --enable-debug 然后下载 cygwin 的软件包,转换为 deb 格式文件 git clone git@gitee.com:david921518/cyg2deb.git cd cyg2deb python3 -m venv env 通过以下命令激活 python 虚拟环境: source env/bin/activate 安装 zstd 支持包 pip3 install xtarfile[zstd] --use-pep517 下载 cygwin 的软件包 python3 cyg2deb.py 安装 cygwin 的软件包 dpkg -i mingw64-x86_64-* 在 QEMU 根目录创建文件 x86_64-w64-mingw32.txt ,内容如下: [binaries] c = '/usr/bin/x86_64-w64-mingw32-gcc' cpp = '/usr/bin/x86_64-w64-mingw32-g++' ar = '/usr/bin/x86_64-w64-mingw32-ar' strip = '/usr/bin/x86_64-w64-mingw32-strip' pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' exe_wrapper = 'wine' [host_machine] system = 'windows' cpu_family = 'x86_64' cpu = 'x86_64' endian = 'little' 获取 libslirp : git clone https://gitlab.freedesktop.org/slirp/libslirp.git 获取 virgl 来实现 3D 硬件加速: git clone https://gitlab.freedesktop.org/virgl/virglrenderer.git 创建新目录来存放编译后产生的 QEMU 依赖组件: export CROSS_QEMU_DEPS="/home/david921518/data/docker/debian12/cross-qemu-deps" mkdir -p $CROSS_QEMU_DEPS 安装 libslirp: cd libslirp meson setup --cross-file ../x86_64-w64-mingw32.txt --prefix "$CROSS_QEMU_DEPS" build-mingw/ meson compile -C build-mingw cd build-mingw ninja install 安装 virgl cd ../../ cd virglrenderer meson setup --cross-file ../x86_64-w64-mingw32.txt --prefix "$CROSS_QEMU_DEPS" build-mingw/ meson compile -C build-mingw cd build-mingw ninja install

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

en_USEnglish