如何在 x86 架构上交叉编译 arm64 架构的 qemu?

2023-03-14 18:45:08 +08:00
 wniming

楼主在 fedora37 和 ubuntu22.04 上试了都不行,都是在 configure 阶段遇到奇怪的,不知道怎么解决的错误。

我在 fedora 上执行的 configure 命令行是:

/a/source/qemu-7.2.0/configure --target-list=aarch64-softmmu --enable-debug --cross-prefix=aarch64-linux-gnu- --prefix=/home/d/.local

报错是:

ERROR: "aarch64-linux-gnu-gcc" cannot build an executable (is your linker broken?)

我在 ubuntu 上执行的命令行是:

~/qemu-7.2.0/configure --target-list=aarch64-softmmu --enable-debug --cross-prefix=aarch64-linux-gnu- --prefix=/home/d/.local

报错是:

ERROR: pkg-config binary 'aarch64-linux-gnu-pkg-config' not found

3011 次点击
所在节点    Linux
25 条回复
lechain
2023-03-14 18:49:39 +08:00
错误提示很明确呀,ERROR: "aarch64-linux-gnu-gcc" cannot build an executable (is your linker broken?) 找不到 目标平台的链接器
ERROR: pkg-config binary 'aarch64-linux-gnu-pkg-config' not found 找不到目标平台的软件包配置
hwdef
2023-03-14 18:49:39 +08:00
ubuntu 上装个包再试试

```
sudo apt-get install -y pkg-config-aarch64-linux-gnu
```
wniming
2023-03-14 18:53:43 +08:00
@hwdef 有这么简单我就不会发帖问了

root@ubuntu:/home/d# apt update
Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease [107 kB]
Get:4 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Fetched 336 kB in 4s (80.6 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
10 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@ubuntu:/home/d# apt-get install -y pkg-config-aarch64-linux-gnu
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package pkg-config-aarch64-linux-gnu
root@ubuntu:/home/d#
wniming
2023-03-14 18:54:23 +08:00
@lechain 他提示什么我当然能看懂,但不知道怎么解决
tags
2023-03-14 18:55:04 +08:00
交叉编译器没装好,sudo apt install crossbuild-essential-arm64
wniming
2023-03-14 18:57:35 +08:00
@tagorewu 感谢回复,刚刚 apt install crossbuild-essential-arm64 安装了还是一样的问题
aapeli
2023-03-14 19:08:51 +08:00
可以试试直接安装 deb 包,
wget http://security.ubuntu.com/ubuntu/pool/universe/g/gcc-defaults/pkg-config-aarch64-linux-gnu_7.4.0-1ubuntu2.3_amd64.deb



# sudo apt install pkg-config
# sudo dpkg -i pkg-config-aarch64-linux-gnu_7.4.0-1ubuntu2.3_amd64.deb
mepwang
2023-03-14 19:17:27 +08:00
你好像没明白在不同的 linux 发行版上,包管理器是不一样的。
在 ubuntu 22.04 上,arm v8 交叉编译器的包名是 gcc-aarch64-linux-gnu
424778940
2023-03-14 19:34:43 +08:00
sudo apt -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cpp-aarch64-linux-gnu binutils-aarch64-linux-gnu
424778940
2023-03-14 19:35:40 +08:00
建议楼主虚心学习基础知识 不要操之过急
wniming
2023-03-14 19:36:40 +08:00
@mepwang @424778940
两位说的包我早就安装了,不行的
424778940
2023-03-14 19:39:56 +08:00
@wniming 我建议你试一试我上面给的命令 不要觉得看起来一样
如果还是不行 就给出新的报错信息 请聪明的问问题
wniming
2023-03-14 20:03:47 +08:00
@424778940

d@ubuntu:~/build$ sudo apt -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cpp-aarch64-linux-gnu binutils-aarch64-linux-gnu
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
cpp-aarch64-linux-gnu is already the newest version (4:11.2.0-1ubuntu1).
g++-aarch64-linux-gnu is already the newest version (4:11.2.0-1ubuntu1).
gcc-aarch64-linux-gnu is already the newest version (4:11.2.0-1ubuntu1).
binutils-aarch64-linux-gnu is already the newest version (2.38-4ubuntu2.1).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
d@ubuntu:~/build$
d@ubuntu:~/build$
d@ubuntu:~/build$ ~/qemu-7.2.0/configure --target-list=aarch64-softmmu --cross-prefix=aarch64-linux-gnu- --prefix=/home/d/.local

ERROR: pkg-config binary 'aarch64-linux-gnu-pkg-config' not found

d@ubuntu:~/build$

我刚才是已经试过了才回帖的
pagxir
2023-03-14 20:09:12 +08:00
安装一下 qemu-user-static 然后 update 一下 binfmt 就可以了。失败是因为 configuration 过程中需要执行编译生成的 arm64 的可执行程序。
pagxir
2023-03-14 20:10:01 +08:00
还有一个方法就是不用交叉编译,直接手机安装 Alpine 编译。
wniming
2023-03-14 20:13:03 +08:00
@pagxir 感谢回复,update 一下 binfmt 要怎么操作?

我开发不可能用手机的,编译效率太低了,不可能每次改了代码都交叉编译的。
BrettD
2023-03-14 20:27:25 +08:00
因为指定了 prefix=aarch64-linux-gnu 所以 configure 去找 aarch64-linux-gnu-pkg-config ,这个 wrapper 要自己做一个,export PKG_CONFIG_PATH=你的交叉编译环境的 pkgconfig 数据路径,然后再调用 pkg-config
424778940
2023-03-14 20:39:08 +08:00
```
export PKG_CONFIG_DIR=""
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig
pkg-config --list-all
```
wniming
2023-03-14 20:41:45 +08:00
@BrettD 感谢回复,我试一下
wniming
2023-03-14 20:46:31 +08:00
@424778940 感谢回复,我的系统上没有 /usr/lib/aarch64-linux-gnu/pkgconfig 这个路径,这个路径是哪个包里的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/923983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX