如何交叉编译,有点懵了

2023-08-29 18:08:19 +08:00
 oneisall8955

最近折腾随身 Wi-Fi ,看到别人开源了 at_server ,仓库如下: https://github.com/newton-miku/jc09

我在 amd64 主机里面编译好了,编译出的执行文件在 amd64 可以运行。但是随身 Wi-Fi 是 arm64 的,需要交叉编译才可以。

里面有个 makefile 如下:

 Makefile
OUTDIR=build
CC = gcc
CFLAGS = $(shell pkg-config --cflags glib-2.0 gio-2.0)
LIBS = $(shell pkg-config --libs glib-2.0 gio-2.0) -lpthread

main: main.c mongoose.c
	$(CC) -o $(OUTDIR)/main main.c mongoose.c $(CFLAGS) $(LIBS)

这个随身 Wi-Fi 的系统信息如下:

root@udx710-module:/ # uname -a
Linux udx710-module 4.14.98 #1 SMP PREEMPT Thu Jul 27 01:59:03 UTC 2023 aarch64 GNU/Linux
root@udx710-module:/ # uname -r
4.14.98
oot@udx710-module:/ # /lib/libc-2.27.so
GNU C Library (GNU libc) stable release version 2.27.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.2.1 20171011.
libc ABIs: UNIQUE
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.

我应该如何修改 makefile ,使用交叉编译的工具链编译出 arm64 的执行文件呢?

1175 次点击
所在节点    问与答
7 条回复
AFOX
2023-08-29 18:24:53 +08:00
替换 cc ,改成交叉编译工具链 arm-linux-gcc 的路径,如果依赖其他库,需要将第三方库也改成交叉编译后的库
lhbc
2023-08-29 18:47:14 +08:00
可以用这个工具链
https://github.com/userdocs/qbt-musl-cross-make

我用这个轻易就把一些工具编译成十几个架构的
oneisall8955
2023-08-29 19:05:36 +08:00
@AFOX makefile 里面的

CFLAGS = $(shell pkg-config --cflags glib-2.0 gio-2.0)
LIBS = $(shell pkg-config --libs glib-2.0 gio-2.0) -lpthread

这两个参数不知道怎么替换

通过 x86_64 amd64 主机执行 pkg-config --cflags glib-2.0 gio-2.0 是这样子的:

root@VM-12-6-ubuntu:~# pkg-config --cflags glib-2.0 gio-2.0
-pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
AFOX
2023-08-29 19:10:51 +08:00
@oneisall8955 交叉编译工具链里面应该有这两个库,你试试手动指定
oneisall8955
2023-08-29 19:51:30 +08:00
@lhbc 大佬,有没有指引应该如何使用?
lhbc
2023-08-29 20:02:30 +08:00
@oneisall8955 有两个办法
一个是这个交叉编译工具链
一般来说就是 export CC=musl-arm64-cc 然后 make
但可能有大量依赖库需要你从头编译

另外一个就是用 user-qemu ,直接在 x86 跑 arm64 的二进制,配合 docker 其实很简单
就是编译性能非常受影响
我看这个仓库的代码很少,应该影响不大

推荐第二个,比较简单
msywkylemon
2023-08-29 23:12:31 +08:00
1. CC 换成你自己 toolchain 对应的
2. pkg 如果也需要换的话要手动去替换路径

pkg 手动替换的话需要设置 PKG_CONFIG_PATH 指定到自己的 pkgconfig 路径,然后修改文件夹里 *.pc 中的引用路径,或者直接用绝对路径替换掉 Cflags 里的路径;
当然你也可以选择直接修改系统(主机) pkgconfig 里的内容,两个方法我都试过

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

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

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

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

© 2021 V2EX