您的位置:首页 > 运维架构 > Linux

使用Rust交叉编译arm程序

2015-05-18 22:13 330 查看
作者: 刘天明

邮箱: bellskinling@gmail.com

博客链接: http://blog.csdn.net/bellskinling

转载请注明出处.

上文, 有了支持arm版本的Rust后, 我们就可以编译在arm下运行的程序了, 下面, 根我一起来体验一下吧

.

使用rustc交叉编译arm静态库

首先来试验一下静态库的编译.新建一个文件arm_lib.rs:
        #![crate_type = "lib"]

                pub fn test() {

                    println!("my lib");

                }
然后编译:
rustc --target=arm-unknown-linux-gnueabi arm_lib.rs
注意, 在这个编译命令中, "--target=arm-unknown-linux-gnueabi" 表示我们编译的版本是不支持硬件浮点(hard-float)的arm的库, 如果读者编译的Rust是支持硬件浮点的,那么编译命令需要改为:
rustc --target=arm-unknown-linux-gnueabihf arm_lib.rs
执行命令后, 正常情况下是没有输出任何信息的, 并且编译后会产生一个libarm_lib.rlib库文件:



这表明我们的库已经编译成功了.

使用rustc交叉编译arm静态的可执行文件

新建文件arm_exe.rs:
fn main() {

    println!("Hello, Rust for arm");

}
然后交叉编译:
rustc --target=arm-unknown-linux-gnueabi arm_exe.rs
很可惜, 编译可执行文件时, 发生了错误:



这个错误输出这么多, 看着很吓人, 但其实其说明的问题很简单, 即我们的链接器出现了错误.
原因出在rustc在编译可执行文件时,使用的链接器是cc, 而cc默认是gcc的一个软链接, 因此导致了rsutc在编译arm时, 使用了本地的gcc的链接器, OMG!!
经过我google后, 我找到了解决方法:
rustc -C linker=arm-linux-gnueabi-gcc --target=arm-unknown-linux-gnueabi arm_exe.rs
即, 在交叉编译时, 指定编译的链接器为交叉编译工具链: -C linker=arm-linux-gnueabi-gcc .
再次执行, OK, 没有任何错误, 查看当前目录, 产生了一个arm_exe文件:



file 指令清楚的说明了我们编译出了一个arm上可以运行的可执行文件, 拿去到开发板上面运行一下吧

.

使用Cargo交叉编译

使用Cargo交叉编译时, 我们同理需要指定交叉编译的链接器.根据http://doc.crates.io/config.html的说明, 我的配置如下:
                cat ~/.ccargo/config

                    [target.arm-unknown-linux-gnueabi]

                    linker = "arm-linux-gnueabi-gcc"

                    ar = "arm-linux-gnueabi-gcc"
其中linker = "arm-linux-gnueabi-gcc"
表示进行交叉编译时使用的链接器. ar = "arm-linux-gnueabi-gcc"表示交叉编译的打包程序, 这一项可以不用设置.
上面是我的Cargo的配置文件,读者可以根据自己的实际情况设置.
设置好Cargo后, 新建一个工程来试验一下吧:
cargo new --bin hello
cd hello
cargo build --target=arm-unknown-linux-gnueabi
注意, 使用cargo进行交叉编译时, 也需要指定平台 --target=arm-unknown-linux-gnueabi
看看编译后, 都产生了什么吧:



file忠实地告诉了我们, cargo编译出了一个arm版本的可执行文件. 那么,  拿去开发板下面运行一下吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm linux rust 交叉编译
相关文章推荐