V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
May725
V2EX  ›  Linux

如何构建交叉编译工具链

  •  
  •   May725 · 2019-07-06 17:18:17 +08:00 · 5341 次点击
    这是一个创建于 1727 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想从源码构建 gcc 交叉编译工具链。
    三个参数类似如下:
    build = linux
    host = windows
    target = arm-linux

    google 一番,编译交叉工具链的博客挺多,但都是 build 和 host 相同情况的资料。
    但是 build 和 host 不同时,并不知道如何处理。
    希望熟悉这方面的 v2er 提供一些资料参考,不吝赐教。

    第 1 条附言  ·  2019-07-11 11:33:35 +08:00

    找到了满意的解决方案 crosstool-ng , 9楼有说明。

    10 条回复    2019-07-12 21:32:21 +08:00
    stern123
        1
    stern123  
       2019-07-06 19:40:33 +08:00 via iPad
    1,build=linux,host=windows 比较难办,可以考虑 build 也换到 windows 下。具体的可以用 cygwin,但存在文件系统大小写的问题,很有可能编不过。
    2,wsl 的方案问题同上,要搭建完整 linux 开发环境的话会编不过。
    3,如果 build 和 host 都是 linux 的话,可以用 buildroot,丝滑体验。
    4,如果你是打算做 linux 开发,建议 host 也换到 linux 去,省很多麻烦。
    5,如果一般用用的话,可以考虑 llvm,可以 cmake 用 msvc 的,build 和 host 都是 windows,产生的编译器也是 native 的,体验会好于 cygwin+gcc。
    wssy
        2
    wssy  
       2019-07-06 19:48:51 +08:00 via Android
    你想在 linux 上编译一个可以运行在 win 上的编译器?使用类似 wine 的环境或许可行。
    May725
        3
    May725  
    OP
       2019-07-07 01:02:17 +08:00
    @stern123
    @wssy
    突然想到 android ndk 的 windows 版本是如何编译出来的?
    stern123
        4
    stern123  
       2019-07-07 08:02:53 +08:00 via iPhone   ❤️ 1
    @May725 #3
    基于 cygwin/mingw 或类似解决方案。如果软件源码中没有文件名大小写的问题,或者没有特别依赖系统服务(如 systemd )的,一般还是能编过的。但如果包含文件名大小写(就是同名文件、仅大小写不同),不论是源码还是中间生成文件,就不能顺利编过(比如遍 glibc 就会遇到这个问题)
    或者 llvm 用 cmake 配 msvc。
    Panic
        5
    Panic  
       2019-07-08 09:27:35 +08:00
    linaro toolchain, 这是你要找的吗, 我记得用这个编过 cross compiler
    Panic
        6
    Panic  
       2019-07-08 09:29:41 +08:00
    看来我理解错了, 上面估计就是 build=host=linux 情形
    Chowe
        7
    Chowe  
       2019-07-08 09:37:59 +08:00
    为什么要在 Windows 上搞交叉编译呢
    May725
        8
    May725  
    OP
       2019-07-08 09:43:22 +08:00
    @Chowe 这个主要是面向客户
    May725
        9
    May725  
    OP
       2019-07-11 11:29:37 +08:00   ❤️ 1
    @stern123 @wssy @Panic

    找到了一个好的解决方案。

    使用 crosstool-ng 构建交叉编译工具链

    https://crosstool-ng.github.io/
    这里阐述了交叉编译的各种情景,且明确说明了能够处理 build !=host !=target 的情况
    http://crosstool-ng.org/git/crosstool-ng/plain/docs/6%20-%20Toolchain%20types.txt

    步骤

    1. 安装
    2. 创建一个 work-dir
    3. cd work-dir
    4. ct-ng list-samples //查看有哪些默认配置模板
    5. ct-ng arm-unknown-gnueabi //根据刚才的列表,选择一个合适的模板
    6. ct-ng menuconfig //在模板基础上进一步细分配置
    7. ct-ng build //开始构建、会持续相当长的时间
    8. 构建结束后,当拷贝到 Windwos 系统时,会丢失符号链接, 我的做法是手动拷贝文件替代符号链接。

    还有一点就是该项目默认是自动到各个官网下载相关源码的
    如果想提供自己的源码,我的做法是:menuconfig 配置为禁止下载,然后手动将源码打包放到指定目录,以此绕过下载步骤。

    更多细节可以参考官方文档。

    这个项目太棒了!
    stern123
        10
    stern123  
       2019-07-12 21:32:21 +08:00 via iPhone
    666 这个工具还是不错的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5479 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:35 · PVG 09:35 · LAX 18:35 · JFK 21:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.