添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
苦闷的饺子  ·  重磅 | AI 圣经 ...·  7 月前    · 
重感情的水煮肉  ·  android - When to use ...·  1 年前    · 

这两天一直在搞rust的交叉编译,大概花了1天半时间才搞明白。官方的文档说的很简单,始终不起作用,直到看了下面的文章才醍醐灌顶。从原理到详细步骤都有了。

RISC-V Bytes: Rust Cross-Compilation · Daniel Mangum

感谢Daniel

我自己也总结了一下,如果有朋友需要的话可以参考

在工程目录下建立文件夹和配置文件

mkdir .cargo && cd .cargo && touch config.toml

然后运行即可

cargo build

以前用过C语言的交叉编译,需要注意的是两个,一个是编译链工具,另一个是sysroot。

主要步骤有两个

  1. 利用编译链工具中的编译器编译c文件,这一步一般没有问题
  2. 利用编译链工具中的链接器将.o文件和从其他系统中拷贝过来的sysroot中的库文件链接到一起

rust的交叉编译似乎更简单一点。

首先rust的编译链工具是跨平台的,不需要重新下载。比如你已经有一个编译链工具,使用如下命令显示

rustup show

在我的电脑上得到

Default host: x86_64-unknown-linux-gnu
rustup home: /home/ubuntu/.rustup

installed toolchains

stable-aarch64-unknown-linux-gnu (default)
stable-x86_64-unknown-linux-gnu

active toolchain

stable-aarch64-unknown-linux-gnu (default)
(error reading rustc version)

说明我拥有两个工具链。但是上述的配置是错误的,应该使用的工具链为stable-x86_64-unknown-linux-gnu(我使用的是ubuntu22, 虚拟机,x86)。

stable-x86_64-unknown-linux-gnu 这个工具链(toolchain)可以再我这个主机(host)上编任何目标(target)平台的程序,而不用像c语言一样,切换一个平台就需要重新下载一次新的toolchain。

其次虽然工具链是单一的,但是target库跟c语言一样,需要链接,所以每一个target都需要下载自己的库文件。比较好的地方是c语言的库文件和头文件需要自己手动从其他系统拷贝过来,但是rust的库文件只需要命令行下载即可!非常方便。

记住这两点,工具链和库,那么交叉编译就基本没问题了。

说一下环境,vmware下跑的ubuntu22虚拟机,输入

uname -a
 

Linux ubuntu-virtual-machine 5.15.0-27-generic #28-Ubuntu SMP Thu Apr 14 04:55:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

初始状态下已经安装rustup,如果没有的话,可以访问网站

https://www.rust-lang.org/tools/install

或者输入命令(linux系统有效)安装一下即可

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. 确认目标机器。我需要在x86下编译,然后在arm64上跑程序。所以使用的是 aarch64-unknown-linux-gnu 。输入命令即可查看

    rustup target list
    

    此时确认一下自己的工具链

    rustup show
       

    Default host: x86_64-unknown-linux-gnu
    rustup home: /home/ubuntu/.rustup

    stable-x86_64-unknown-linux-gnu (default)
    rustc 1.60.0 (7737e0b5c 2022-04-04)

    可以看到目前只有一个工具链,没有target(其实有target,但是target是本机,所以不显示)。所以此时编译出来的程序可以在本地跑起来

    cargo new hello
    cd hello
    cargo run
       

    Compiling hello v0.1.0 (/home/ubuntu/test/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 4.94s
    Running target/debug/hello
    Hello, world!

  2. 下载arm库

    rustup target add aarch64-unknown-linux-gnu
    

    运行命令确认

    rustup show
       

    Default host: x86_64-unknown-linux-gnu
    rustup home: /home/ubuntu/.rustup

    installed targets for active toolchain

    aarch64-unknown-linux-gnu
    x86_64-unknown-linux-gnu

    active toolchain

    stable-x86_64-unknown-linux-gnu (default)
    rustc 1.60.0 (7737e0b5c 2022-04-04)

    此时有一个toolchain,两个target;其中aarch64-unknown-linux-gnu就是我需要的

  3. 下载目标平台gcc,配置target和链接器
    这一步非常关键,而且让人迷惑。rust编译程序的过程需要用到自己的工具链,同时还需要用到gcc的链接工具!但是他们的名字非常接近但是又不完全一样。
    还有一个我之前屡次失败的原因是:rust安装方式有问题!!!!!!!!!!我之前用的是

    sudo apt install cargo
    

    这样会导致rustup的路径出现问题,千万要注意如果想正确编译的话必须用官网推荐的安装方法,也就是

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

    首先安装gcc

    sudo apt-get install -qq gcc-aarch64-linux-gnu
    

    安装完成后如果输入以下命令有结果的话说明安装成功

    aarch64-linux-gnu-gcc -v
    

    然后添加配置文件。在刚才建立的工程目录 hello 下

    mkdir .cargo && cd .cargo && touch config.toml
    

    将以下内容复制入config.toml内即可

    [build]
    target = “aarch64-unknown-linux-gnu”

    [target.aarch64-unknown-linux-gnu]
    linker = “aarch64-linux-gnu-gcc”

  4. 编译并运行

    cargo clean
    cargo build
    cargo run
    

    如果输出以下信息,表示编译成功

    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/aarch64-unknown-linux-gnu/debug/hello`
       

    target/aarch64-unknown-linux-gnu/debug/hello: 1: cannot open @8: No such file
    target/aarch64-unknown-linux-gnu/debug/hello: 1: ELF��g@�:: not found
    target/aarch64-unknown-linux-gnu/debug/hello: 2: @+*@@@0ppp
    �D��������+�-�: not found
    target/aarch64-unknown-linux-gnu/debug/hello: 3: �: not found
    target/aarch64-unknown-linux-gnu/debug/hello: 4: �: not found
    target/aarch64-unknown-linux-gnu/debug/hello: 5: Syntax error: “(” unexpected

    注意将hello程序拷贝出来后放入目标系统

    chmod +x hello 
    ./hello
    

    会产生如下信息

    ./hello: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.28’ not found (required by ./hello)

    说明目标系统的ubuntu版本过低。。。。

    两种选择,目标系统升级系统到ubuntu22,或者host系统降级到ubuntu18即可。

这两天一直在搞rust的交叉编译,大概花了1天半时间才搞明白。官方的文档说的很简单,始终不起作用,直到看了下面的文章才醍醐灌顶。从原理到详细步骤都有了。原文链接RISC-V Bytes: Rust Cross-Compilation · Daniel Mangum感谢Daniel我自己也总结了一下,如果有朋友需要的话可以参考简洁版在工程目录下建立文件夹和配置文件mkdir .cargo && cd .cargo && touch config.toml然后运
Rust相比Go的优势: Rust可以做内联汇编,Go不行(Rust的SIMD库也在开发中,这种事情你不会用Go做)。 Rust有确定性析构,Go没有,只能whole-world-stop做GC。 Rust的接口(trait)可以静态派发,做zero-costabstraction,Go不行,它的interface只能靠反射做动态派发。 Rust没有运行时,可以写操作系统(我估计至少需要几百行汇编做bootstrap),Go离这种能力很远。 Rust有一个更丰富的类型系统,表达能力更强,允许你做更高层次的抽
0x00 开篇 什么是交叉编译?可能有的同学不理解。我这里简单介绍下,所谓交叉编译,就是在一个平台上可以编译生成另一个平台的可执行文件。这节课主要介绍如何在Windows系统上编译生成Linux系统的可执行文件。 0x01 准备工作 我们跨平台编译,要准备如下一些前期工作。 Windows 11 VS2012(VS2019我也测试过) CLion Rust 1.56.1 CentOS 7 添加Target 这里我所用的Linux是64位的,所以我这里需要添加x86_64-unknown-lin
【GUI程序最好还是在各个平台编译,跨平台编译一大堆问题(我这边是报错了),源码跨平台也很不错了(而且如果是Windows,最好是在win7编译,这样能支持win8和10,而在win10编译的在win7和8可能运行不了),可以装虚拟机专门用于多平台编译】 通过命令查看支持哪些OS和CPU架构 rustc --print target-list | pr -tw100 --columns 3 toolchain和target分别是,toolchain是交叉编译所需的“编译工具”,而target则是.
Rust 交叉编译指的是在一台计算机上编译出可以在另一种体系结构的计算机上运行的可执行文件。例如,在 x86 架构的计算机上编译出 ARM 架构的可执行文件。 要进行 Rust 交叉编译,需要安装目标架构的交叉编译工具链。可以通过 Rust 官方提供的 `rustup` 工具来安装交叉编译工具链。例如,要在 x86 架构的计算机上编译出 ARM 架构的可执行文件,可以执行以下命令: rustup target add armv7-unknown-linux-gnueabihf 接下来,可以使用 Cargo 的 `--target` 参数来指定目标架构。例如,要编译出 ARM 架构的可执行文件,可以执行以下命令: cargo build --target=armv7-unknown-linux-gnueabihf 这样,就可以在 x86 架构的计算机上编译出 ARM 架构的可执行文件了。
moonfish_930: 这个不太清楚诶,似乎界面上直接有这个功能的 https://guacamole.apache.org/doc/gug/using-guacamole.html#client-share-menu 可以调试一下应该能找到代码位置 Guacamole录屏配置 qq_39840507: https://guacamole.apache.org/doc/gug/guacamole-ext.html#managing-sharing-active-connections Guacamole录屏配置 qq_39840507: 就是临时链接 一个用户访问他可以分享出一个链接 然后其他人都可以访问这个链接看到你在使用的界面 只不过是代码实现 Guacamole录屏配置 moonfish_930: 共享链接是什么意思? 能具体说一下么