本文在ubuntu20.04上对qemu进行交叉编译

注意:NDK编译器工具API级别要在30以后,最好用33

因为只有30以后的版本支持函数memfd_create,详情请看http://t.csdn.cn/465cy

1.下载并安装Android NDK

NDK 下载  |  Android NDK  |  Android Developershttps://developer.android.google.cn/ndk/downloadsNDK下载网址下载linux版本安装包:android-ndk-r25-linux.zip

vi ~/.bashrc

export API=21
export NDK=/home/dubu/android-ndk-r25
export NDK_CROSS=${NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin
export SYSROOT=${NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export PKG_CONFIG_PATH=${SYSROOT}/python3/lib/pkgconfig
export PKG_CONFIG_LIBDIR=${NDK_CROSS}
export PATH=${PATH}:${NDK}:${NDK_CROSS}

source .bashrc

2.安装glib库

下载glib

git clone https://github.com/GNOME/glib.git

cd glib

cat HACKING     /*查看HACKING文件*/

HACKING文件内容如下:

If you want to hack on the GLib project, you'll need to have the
following packages installed:- Meson 0.48.0- GNU gettext 0.10.40- pkg-config 0.16- gtk-doc- libffi 3.0.0To compile a Git version of glib on your system, you will need to take
several steps to setup the tree for compilation.  You can do all these
steps at once by running:checkout/glib# meson _buildFor information about submitting patches see the CONTRIBUTING.md file. For
information about major design decisions, see the docs/README.rationale file.

想要编译glib库,需要如下几个组件:

- Meson 0.48.0
        - GNU gettext 0.10.40
        - pkg-config 0.16
        - gtk-doc
        - libffi 3.0.0

(1)安装MMeson 0.48.0或以上版本

注意:meson安装前必须确认是否已经安装python3.5及以上版本;因为meson依赖于python3和ninja

sudo apt-get install python3 python3-pip ninja-build

sudo pip3 install --user meson

测试meson是否安装成功,此步骤可以忽略:

创建1.c与meson.build两个文件

vim 1.c
#include <stdio.h>int main()
{printf("hello world\n");return 0;
}vim meson.build
project('tutorial', 'c')
executable('demo', '1.c')

meson builid

cd build

ninja

./demo

在执行./demo的时候会打印出hello world.

(2)安装GNU gettext 0.10.40或以上版本

官网地址:https://www.gnu.org/software/gettext/

wget https://ftp.gnu.org/pub/gnu/gettext/gettext-0.21.tar.gz

tar -zxvf gettext-0.21.tar.gz

cd gettext-0.21

sudo ./configure

sudo make

sudo make install

(3)安装pkg-config 0.16及以上版本

方法一:

sudo apt-get install pkg-config

方法二:

Linux上,到pkg-config官网https://www.freedesktop.org/wiki/Software/pkg-config/,下载最新安装包

tar -zxvf pkg-config-0.29.2.tar.gz

cd pkg-config-0.29.2/

./configure

make

make check

sudo make install

pkg-config --version

(4)安装gtk-doc

参考网址:

Ubuntu安装GTK+教程 - 一杯清酒邀明月 - 博客园Step 1 修改清华源(修改完可提高下载速度) 先运行 sudo gedit /etc/apt/sources.list 替换文本内容,保存,退出。 # 默认注释了源码镜像以提高 apt updathttps://www.cnblogs.com/ybqjymy/p/12964668.html

(5)安装libffi 3.0.0及以上版本

sudo apt-get install libffi-dev

此前的内容当作废话,真正的交叉编译从这里开始。因为写的太好不想删除。

3.安装libiconv

官网地址:libiconv - GNU Project - Free Software Foundation (FSF)https://www.gnu.org/software/libiconv/?spm=a2c6h.12873639.article-detail.6.5409666ffjh5uO#TOCdownloading

下载地址:https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz

ln -sf ${NDK_CROSS}/aarch64-linux-android21-clang ${NDK_CROSS}/aarch64-linux-android21-gcc

ln -sf ${NDK_CROSS}/aarch64-linux-android21-clang++ ${NDK_CROSS}/aarch64-linux-android21-g++

tar -zxvf libiconv-1.17.tar.gz

cd libiconv-1.17

mkdir build && cd build

CC="aarch64-linux-android21-gcc" CFLAGS="-I${SYSROOT}/usr/include --sysroot $SYSROOT" ../configure --prefix="${SYSROOT}/usr" --host=arm-linux-android21 --enable-shared=yes --enable-static=no

make && make install

4.安装gettext

官网地址:

Index of /pub/gnu/gettexthttps://ftp.gnu.org/pub/gnu/gettext/?C=M;O=A下载安装包:gettext-0.21.tar.gz

tar -zxvf gettext-0.21.tar.gz

cd gettext-0.21 && mkdir build && cd build

CC="aarch64-linux-android21-clang" CPP="aarch64-linux-android21-clang -E" CPPFLAGS="-I${SYSROOT}/usr/include" CXX="aarch64-linux-android21-clang++" CXXCPP="aarch64-linux-android21-clang++ -E" ../configure --prefix="${SYSROOT}/usr" --host=arm-linux-android21 CFLAGS="-fPIC" --with-libiconv-prefix=${SYSROOT}/usr --with-sysroot=${SYSROOT}

make

make install

http://t.csdn.cn/NZ7Gfhttp://t.csdn.cn/NZ7Gf若是make install出现问题,可以查看上面的连接进行解决。

5.安装libffi

官网地址:libffihttps://sourceware.org/libffi/

下载安装包:libffi-3.4.2.tar.gz

tar -zxvf libffi-3.4.2.tar.gz

cd libffi-3.4.2 && mkdir build && cd build

../configure --prefix="${SYSROOT}/usr" --host=aarch64-linux-android21 --with-sysroot=${SYSROOT}  CC=${NDK_CROSS}/aarch64-linux-android21-gcc  CFLAGS="-march=armv8-a -DANDROID" CXX=${NDK_CROSS}/aarch64-linux-android21-g++  CXXFLAGS="-march=armv8-a -DANDROID" CPPFLAGS="-I${SYSROOT}/usr/include" LDFLAGS="-L${SYSROOT}/usr/lib" --disable-multi-os-directory --target=aarch64-linux-android21

make

make install

可以查看如下网址,对gcc 的-march,-mtune,-mcpu作大概了解。

ARM-GCC编译选项解释_superaxi的博客-CSDN博客_arm gcc 编译选项ARM选项-mabi=name为指定的ABI生成代码。允许值为:‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ 和 ‘iwmmxt’-mapcs-frame为所有功能生成符合ARM过程调用标准的堆栈框架,即使这对于正确执行代码不是绝对必要的。指定-fomit-frame-pointer 如果使用此选项,则不会为叶函数生成堆栈帧。默认是-mno-apcs-frame。不建议使用此选项。-mapcs这是和 -mapcs-frame选项一样, 并已弃用。-mthttps://blog.csdn.net/luoqingxi000/article/details/110430292

6.安装pcre

官网地址:http://pcre.org/

下载安装包:pcre2-10.40.zip

unzip pcre2-10.40.zip

cd pcre2-10.40 && mkdir build && cd build

CC="aarch64-linux-android21-gcc" LDFLAGS="-L${SYSROOT}/usr/lib" CPPFLAGS="-I${SYSROOT}/usr/include" ../configure --prefix=${SYSROOT}/usr --host=aarch64-linux-android21 --with-sysroot=${SYSROOT}/usr

make

make install

7.安装pixman-0.34

http://t.csdn.cn/ht6t6

8.安装glib

http://t.csdn.cn/wr6mZ

9.编译qemu

编译命令如下:

下面的编译命令只做参考:

PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig" ../configure --prefix=/home/dubu/installtest --target-list=x86_64-softmmu --cpu=aarch64 --cross-prefix=aarch64-linux-android33- --cc=aarch64-linux-android33-clang --cxx=aarch64-linux-android33-clang++ --host-cc=aarch64-linux-android33-gcc --enable-gettext --enable-iconv --enable-kvm --enable-pie --enable-gio --enable-qcow1 --enable-vhost-user

上面的配置命令只做参考,用下面的配置命令配置:

PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig" ../configure --prefix=/home/dubu/installtest --target-list=x86_64-softmmu --cpu=aarch64 --cross-prefix=aarch64-linux-android33- --python=$NDK_PYTHON --extra-cflags=" --sysroot=$SYSROOT" --extra-cxxflags=" --sysroot=$SYSROOT" --enable-pie

为什么要加上--enable-pie和--extra-cflags=" --sysroot=$SYSROOT" --extra-cxxflags=" --sysroot=$SYSROOT" 看如下链接:

http://t.csdn.cn/ItOme

http://t.csdn.cn/aK8F1

只交叉编译出可以运行win10的运行程序即可。

PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig",这个是指定交叉编译好的依赖包的位置。

--cross-prefix=aarch64-linux-android33- 这个是指定的交叉编译前缀,这个选项用于表明是交叉编译,详情可以去看官网qemu的交叉编译的介绍。

其中会报找不到aarch64-linux-android33-pkg-config

ln -s  /usr/bin/pkg-config  aarch64-linux-android33-pkg-config

make报错:

aarch64-linux-android29-clang  -o subprojects/libvhost-user/link-test subprojects/libvhost-user/link-test.p/link-test.c.o -Wl,--as-needed -Wl,--no-undefined -pie -Wl,--whole-archive -Wl,--start-group subprojects/libvhost-user/libvhost-user.a -Wl,--end-group -Wl,--no-whole-archive -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -pthread
ld: error: undefined symbol: memfd_create
>>> referenced by libvhost-user.c:1670 (../subprojects/libvhost-user/libvhost-user.c:1670)
>>>               libvhost-user.a.p/libvhost-user.c.o:(vu_dispatch) in archive subprojects/libvhost-user/libvhost-user.a
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)

可查看如下网址解决:

http://t.csdn.cn/kl8UT

make 报错:

[69/2776] Linking target subprojects/libvhost-user/link-test
FAILED: subprojects/libvhost-user/link-test
aarch64-linux-android33-clang  -o subprojects/libvhost-user/link-test subprojects/libvhost-user/link-test.p/link-test.c.o -Wl,--as-needed -Wl,--no-undefined -pie -Wl,--whole-archive -Wl,--start-group subprojects/libvhost-user/libvhost-user.a -Wl,--end-group -Wl,--no-whole-archive -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -pthread
ld: error: undefined symbol: vring_need_event
>>> referenced by libvhost-user.c:2399 (../subprojects/libvhost-user/libvhost-user.c:2399)
>>>               libvhost-user.a.p/libvhost-user.c.o:(_vu_queue_notify) in archive subprojects/libvhost-user/libvhost-user.a
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
make: *** [Makefile:163:run-ninja] 错误 1

其实这里的函数vring_need_event在/usr/include/linux/virtio_ring.h和~/qemu-7.0.0/include/standard-headers/linux/virtio_ring.h中都有定义,而正常编译的时候用的/usr/include/linux/virtio_ring.h文件,而不是~/qemu-7.0.0/include/standard-headers/linux/virtio_ring.h这个文件里面的定义,因为这两文件的开头是都

#ifndef _LINUX_VIRTIO_RING_H
#define _LINUX_VIRTIO_RING_H,所以包含了其中一个就不会包含另外一个。

这里的解决办法是把/usr/include/linux/virtio_ring.h文件里面定义的函数vring_init,vring_size,vring_need_event添加到${SYSROOT}/usr/include/linux/virtio_ring.h文件里面。

并且把~/qemu-7.0.0/include/standard-headers/linux/virtio_ring.h文件里面的_LINUX_VIRTIO_RING_H改成“_UAPI_LINUX_VIRTIO_RING_H”,因为交叉编译用到的是${SYSROOT}/usr/include/linux/virtio_ring.h这个文件。可以参考如下链接:

http://t.csdn.cn/lJbnw

http://t.csdn.cn/HX5Fk

出现qemu:tests/qtest/libqos/libqos.fa.p/pci.c.o报错,查看http://t.csdn.cn/gS8js

出现shm_open和shm_unlink这两个函数未定义的报错,直接在build.ninja里面删除这个目标(在all里面的目标里面删除)就可以了,为什么,因为是在contrib目录下的目标用到了这来两个函数,而且删除这个目录下面的内容对于运行虚拟机没有什么影响,所以就删除了。

具体做法:打开build.ninja文件

在编译目标build all,build build.ninja,以及最后一个build里面,删除带有contrib/的所有目标,并且删除tests/qtest/ivshmem-test目标。这些目标的生成规则可以不用管。

至此编译就可以成功了,如果遇到新问题,欢迎留言。

make install 会报错aarch64-linux-android33-strip文件未找到

ln -sf llvm-strip aarch64-linux-android33-strip即可。

注意:我这边只是说编译成功,没有说可以在android上面运行win10。

编译可在Android上运行的qemu相关推荐

  1. android通过c调用shmat函数,编译可在Android上运行的qemu user mode

    编译可在Android上运行的qemu user mode @(Android研究)[android|qemu] [TOC] 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编 ...

  2. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的"NDK"若无特殊说明均指"Android ...

  3. 静态编译parted在Android上运行

    [前言] 现在有越来越多的Android手机用上了GPT分区表.我目前接触过的有:华为C8816.G6-C00.Ascend P6,中兴U880E,还有亚马逊Kindle Fire.目前我不太好解释G ...

  4. ace+arm+linux,用NDK编译ACE在Android上运行

    1.准备工具链 ./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-Androideabi-4.4.3 --arch=ar ...

  5. 编译可在Android上运行的依赖库(二):gettext库

    随着代码的不断更新,原来的文章有很多地方已经不适用于现在,所有增加了本文章,对过去NDK交叉编译gettext源码进行更改和补充. 下载gettext源码gettext-0.21.tar.gz: In ...

  6. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的&q ...

  7. python程序在安卓上如何运行-在 android 上运行 python 的方法

    在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...

  8. 如何用android下载python_如何在android上运行Python代码

    展开全部 在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的e69da5e6ba906261696475 ...

  9. 安卓如何运行python_如何在android上运行Python代码?

    这个非常简单,Termux和QPython3这2个安卓APP就可以,都集成了Python解释器,可以直接编辑运行Python代码,下面我简单介绍一下: Termux 这是一个安卓高级终端APP,类似于 ...

最新文章

  1. mysql使用命令提示符创建库表
  2. Problem 2238 Daxia Wzc's problem 1627 瞬间移动
  3. 北工大计算机学院教授,北工大计算机学院计算机科学与技术导师介绍:周艺华...
  4. 无线网络渗透测试-使用Wifite破解无线网络
  5. Linux配置Java,kafka,Hadoop等环境变量
  6. acwing----春季每日一题2022篇(一)
  7. Elasticsearch 架构原理
  8. python中静态方法存在的意义
  9. java中的比较运算符_Java基础---Java中的比较运算符(十三)
  10. 【转】电脑显示有软驱
  11. 使用电脑开发的,连个黑屏休眠都不会设置?
  12. 企业ad域管理教程,有哪些有效的AD域管理办法?
  13. http服务器 显示中文乱码,Tomcat Http请求中文乱码
  14. 音视频学习之基础概念整理(rgb/yuv,pcm,采样频率,帧率,码率,i帧p帧b帧,dts/pts)
  15. selenium不定位元素直接操作键盘之Keys.CONTROL
  16. SCI声学期刊名以及影响因子
  17. C语言中数值后面跟字母解析
  18. 大佬H5网页手机端怎么应用微信快捷登陆?
  19. vue使用echarts-liquidfill水球图不生效
  20. VUE3 之 状态动画 - 这个系列的教程通俗易懂,适合自学

热门文章

  1. Image2Lcd图片取模软件
  2. 深度探索C++对象模型pdf
  3. 前端白屏问题_前端性能优化之白屏时间
  4. 干货:压敏电阻选型和注意事项,必知
  5. 个人爆发式成长的25种思维 | 筛选思维
  6. 三方协议服务器不填,毕业生三方协议可以不填么
  7. “3D游戏之父”手游考古,网友:求支持智能手机!
  8. 「Nescafé26」 Freda的传呼机 【树上倍增+图论】
  9. 使用Statsmodels在Python中进行重复测量方差分析
  10. C++基础概念(初步代码示例英石与磅单位互换)