首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为riscv64gc-未知-linux构建一个Rust程序?

如何为riscv64gc-未知-linux构建一个Rust程序?
EN

Stack Overflow用户
提问于 2022-11-13 20:18:11
回答 1查看 67关注 0票数 1

我正试图交叉编译一个用于第3层平台riscv64gc-unknown-linux-musl的Rust程序,但我认为无论是链接还是正确地指导货物,都会遇到问题。

我试过跑步:

代码语言:javascript
运行
复制
cargo +nightly build -Z build-std --target riscv64gc-unknown-linux-musl

正如这个问题的答案这个问题的答案所指出的,会导致大量错误:

代码语言:javascript
运行
复制
  = note: /usr/bin/ld: cannot find crt1.o: No such file or directory
          /usr/bin/ld: cannot find crti.o: No such file or directory
          /usr/bin/ld: cannot find crtbegin.o: No such file or directory
          /usr/bin/ld: /home/lindon/Projects/Rust/open_computers_lib/target/riscv64gc-unknown-linux-musl/debug/deps/open_computers_lib-0a95fe466728767f.1n96vpe9sdkbhvag.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/lindon/Projects/Rust/open_computers_lib/target/riscv64gc-unknown-linux-musl/debug/deps/open_computers_lib-0a95fe466728767f.1n96vpe9sdkbhvag.rcgu.o: Relocations in generic ELF (EM: 243)
...

(编辑用不同文件名重复的最后一行的较长列表)

我还尝试使用来自这里的预构建交叉编译工具链,以及尝试从这里构建工具链,然后使用以下脚本:

代码语言:javascript
运行
复制
export PATH="/opt/riscv-musl/riscv64-unknown-linux-musl/bin/:$PATH"
cargo +nightly build -Z build-std --target riscv64gc-unknown-linux-musl # same as before

这给了我(对于预先构建的工具链和亲自构建的工具链的相同错误日志):

代码语言:javascript
运行
复制
   Compiling compiler_builtins v0.1.82
   Compiling core v0.0.0 (/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core)
   Compiling libc v0.2.135
   Compiling cc v1.0.73
   Compiling memchr v2.5.0
   Compiling std v0.0.0 (/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std)
error: linking with `cc` failed: exit status: 1
  |
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* = note: "cc" "-m64" "/tmp/rustcL7qcAR/symbols.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.0.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.1.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.10.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.11.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.12.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.13.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.14.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.15.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.2.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.3.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.4.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.5.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.6.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.7.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.8.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.build_script_build.731b8ff0-cgu.9.rcgu.o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73.1qnaa8r4se7kx3js.rcgu.o" "-Wl,--as-needed" "-L" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/deps" "-L" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-f30f0c72643db558.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-f568c570fff954b1.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-e7b70edde5e55443.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-e89379089032cd0e.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-e7d90005a619f6ea.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-e8fa7b53a3149a70.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-db4d651637ed1365.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-255c18ca7ff0a7c6.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-1791beb5b36e409b.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-ab2b83cf39766489.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-21993ed5a33c1bb3.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-b113a1d1429de7b6.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-0aacf29316aaa95c.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-fcf994c37af81dc5.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-a5319eed00c3264d.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-c6c03e024a2f1e46.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-522518611024dce5.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-05898138a596088a.rlib" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-b7c79d85cf21a511.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/lindon/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/lindon/Projects/Rust/open_computers_lib/target/debug/build/std-c8bbb31701f1fb73/build_script_build-c8bbb31701f1fb73" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-nodefaultlibs"
*/
  = note: /opt/riscv-musl/riscv64-unknown-linux-musl/bin/ld: unrecognised emulation mode: elf_x86_64
          Supported emulations: elf64lriscv elf64lriscv_lp64f elf64lriscv_lp64 elf32lriscv elf32lriscv_ilp32f elf32lriscv_ilp32 elf64briscv elf64briscv_lp64f elf64briscv_lp64 elf32briscv elf32briscv_ilp32f elf32briscv_ilp32
          collect2: error: ld returned 1 exit status
          

error: could not compile `std` due to previous error
warning: build failed, waiting for other jobs to finish...
...

nightly-x86_64-unknown-linux-gnustd路径中的存在使我相信我可能是在错误地指示货物,或者仅仅是因为我的主机系统是x86_64-unknown-linux-gnu

可能具有重要意义的补充资料:

  • 这个程序只有一个空的main函数。
  • 所有测试都是在运行完整的系统升级和运行rustup update之后完成的,我在项目中使用了2021年版的Rust。
  • 我在运行Arch Linux。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 18:18:03

先决条件/假设

这个答案假设如下:

  • 您正在运行Linux。
  • riscv linux musl C交叉工具链安装在/opt/riscv-musl/上。
    • 如果您还没有程序包管理器,则需要从您的包管理器从这里下载并解压缩从这里自己建中获取一个。
    • 如果它没有安装在/opt/riscv-musl/上,只需将这些指令中的路径替换为安装工具链的位置即可。

  • 你每晚都要安装铁锈。
    • 如果没有,运行rustup toolchain install nightly

使用说明

具有如下所示的Rust项目文件夹结构:

代码语言:javascript
运行
复制
├── src/
├── .cargo/
│   └── config.toml
└── compile.sh

内部config.toml

代码语言:javascript
运行
复制
[target.riscv64gc-unknown-linux-musl]
rustflags = [
    "-C", "target-feature=-crt-static"
]
linker = "riscv64-unknown-linux-musl-gcc"
ar = "riscv64-unknown-linux-musl-ar"

内部compile.sh

代码语言:javascript
运行
复制
export PATH="/opt/riscv-musl/bin/:$PATH"
cargo +nightly build -Z build-std --target riscv64gc-unknown-linux-musl

如果riscv64-unknown-linux-musl-gccriscv64-unknown-linux-musl-ar已经在$PATH上了,那么compile.sh中的export语句就没有必要了。

现在,如果您想编译到riscv64gc-unknown-linux-musl目标,只需运行compile.sh

更多信息

为了获得我最终获得的Functionalconfig.toml,我采取了以下步骤:

代码语言:javascript
运行
复制
[target.riscv64gc-unknown-linux-musl]
rustflags = [
"-L/home/blackdragon2447/x-tools/riscv64-unknown-linux-musl/riscv64-unknown-linux-musl/sysroot/lib",
"-L/home/blackdragon2447/x-tools/riscv64-unknown-linux-musl/lib/gcc/riscv64-unknown-linux-musl/11.2.0/",
"-L/home/blackdragon2447/x-tools/riscv64-unknown-linux-musl/riscv64-unknown-linux-musl/sysroot/usr/lib",
"-C", "link-args=-lc",
"-C", "prefer-dynamic",
"-C", "target-feature=-crt-static"
]
ar = "riscv64-unknown-linux-musl-ar"
linker = "riscv64-unknown-linux-musl-gcc"

如果这个答案中的那个由于某种原因不能工作,那么就试着使用它(不要忘记改变其中的路径)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74424444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档