V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
oneisall8955
V2EX  ›  问与答

如何交叉编译,有点懵了

  •  
  •   oneisall8955 · 2023-08-29 18:08:19 +08:00 · 1191 次点击
    这是一个创建于 477 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近折腾随身 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 的执行文件呢?

    7 条回复    2023-08-29 23:12:31 +08:00
    AFOX
        1
    AFOX  
       2023-08-29 18:24:53 +08:00 via Android
    替换 cc ,改成交叉编译工具链 arm-linux-gcc 的路径,如果依赖其他库,需要将第三方库也改成交叉编译后的库
    lhbc
        2
    lhbc  
       2023-08-29 18:47:14 +08:00
    可以用这个工具链
    https://github.com/userdocs/qbt-musl-cross-make

    我用这个轻易就把一些工具编译成十几个架构的
    oneisall8955
        3
    oneisall8955  
    OP
       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
        4
    AFOX  
       2023-08-29 19:10:51 +08:00 via Android
    @oneisall8955 交叉编译工具链里面应该有这两个库,你试试手动指定
    oneisall8955
        5
    oneisall8955  
    OP
       2023-08-29 19:51:30 +08:00 via Android
    @lhbc 大佬,有没有指引应该如何使用?
    lhbc
        6
    lhbc  
       2023-08-29 20:02:30 +08:00 via Android
    @oneisall8955 有两个办法
    一个是这个交叉编译工具链
    一般来说就是 export CC=musl-arm64-cc 然后 make
    但可能有大量依赖库需要你从头编译

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

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

    pkg 手动替换的话需要设置 PKG_CONFIG_PATH 指定到自己的 pkgconfig 路径,然后修改文件夹里 *.pc 中的引用路径,或者直接用绝对路径替换掉 Cflags 里的路径;
    当然你也可以选择直接修改系统(主机) pkgconfig 里的内容,两个方法我都试过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5283 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:40 · PVG 16:40 · LAX 00:40 · JFK 03:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.