< 返回版块

ciallomino 发表于 2022-09-14 09:52

我在使用rust进行交叉编译,在windows上编译Linux可运行的程序 执行下列命令

#添加target
rustup target add x86_64-unknown-linux-musl

#在用户目录下.cargo/config文件中添加以下内容
[target.x86_64-unknown-linux-musl]
linker = "rust-lld"
rustflags = ["-C", "linker-flavor=ld.lld"]

#创建项目
cargo new cross_test
cd cross_test

#编译
cargo build --target x86_64-unknown-linux-gnu

使用target使用musl时可以编译成功,编译产物也可以在Linux上执行 但是,在将musl换成gnu后,编译出错,会出现“rust-lld: error: unable to find library xxx” 过程如下:

#添加target
rustup target add x86_64-unknown-linux-gnu
#在用户目录下.cargo/config文件中添加以下内容
[target.x86_64-unknown-linux-gnu]
linker = "rust-lld"
rustflags = ["-C", "linker-flavor=ld.lld"]

#创建项目
cargo new cross_test
cd cross_test

cargo build --target x86_64-unknown-linux-gnu

错误日志:

PS D:\projects\rust\cross_test> cargo build --target x86_64-unknown-linux-gnu
   Compiling cross_test v0.1.0 (D:\projects\rust\cross_test)
error: linking with `rust-lld` failed: exit code: 1
  |
  = note: "rust-lld" "-flavor" "gnu" "C:\\Users\\admin\\AppData\\Local\\Temp\\rustcLRA8ow\\symbols.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.1kvydfipr7qjf8h6.rcgu.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.2ffa9glwcyzjky3e.rcgu.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.2shu5nzpz2oheli7.rcgu.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.51fn6ocrqxukd4z5.rcgu.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.584w3mbbw59uau9w.rcgu.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.5dt0596i5xvmevk7.rcgu.o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee.4jsb2sguthcuu9cu.rcgu.o" "--as-needed" "-L" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps" "-L" "D:\\projects\\rust\\cross_test\\target\\debug\\deps" "-L" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib" "-Bstatic" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libstd-4393e7d07259b8a4.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libpanic_unwind-e13cbb326bcd01a4.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libobject-13ac6af5403a52c8.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libmemchr-a7b8febdd2acb289.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libaddr2line-343513f0726f71ed.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libgimli-8f833d900bfb98aa.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\librustc_demangle-e97a7960ca6216c8.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libstd_detect-683fb35093a61fcc.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libhashbrown-f943c2d34bd4b56d.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libminiz_oxide-72ce2aaa649404e0.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libadler-ac5d08ad5339e92e.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\librustc_std_workspace_alloc-dacfda262d5656fb.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libunwind-e2056a834ba0712c.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libcfg_if-a60649c148c6e2db.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\liblibc-3e961d059b9bcde7.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\liballoc-20f26f875d0170e2.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\librustc_std_workspace_core-522518611024dce5.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libcore-05898138a596088a.rlib" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib\\libcompiler_builtins-5b83a1df856cf582.rlib" "-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "--eh-frame-hdr" "-znoexecstack" "-L" "C:\\Users\\admin\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-unknown-linux-gnu\\lib" "-o" "D:\\projects\\rust\\cross_test\\target\\x86_64-unknown-linux-gnu\\debug\\deps\\cross_test-f9c858253b9dfaee" "--gc-sections" "-pie" "-zrelro" "-znow"
  = note: rust-lld: error: unable to find library -lgcc_s
          rust-lld: error: unable to find library -lutil
          rust-lld: error: unable to find library -lrt
          rust-lld: error: unable to find library -lpthread
          rust-lld: error: unable to find library -lm
          rust-lld: error: unable to find library -ldl
          rust-lld: error: unable to find library -lc


error: could not compile `cross_test` due to previous error

评论区

写评论
c00t 2022-09-20 10:44

所以,没有 object 文件就生成啊。rust 目前 gnu target 的问题就是,你下载的 std rlibs,是动态链接到 glibc 的,但是 rust 没有把 glibc 的 object 文件也下载给你。

要在没有工具的帮助下在 Windows 做到真正的交叉编译,你需要自己在 Windows 下 build 一个 cross-compiler(或者用已有的 cross-compiler ) 看这里,然后编译出 glibc(target=some_linux_arch) 的 object 文件,再把包含生成好的 libc object file 的文件夹作为 lld 的搜索路径。

(但是说实话,上面的路子你能找到的东西很少

没记错的话 cargo-cross 是用的 docker 吧,这算哪门子的 win-linux 交叉编译,还是移到 linux 下用了 linux 的工具链,最多就是 zero-config 而已...写个脚本用 windows 自带的 wsl 都能搞完,那还不如直接 linux 开发呢对吧

--
👇
ciallomino: 谢谢解答,现在搞清楚了musl和gnu的差异,我现在可以通过设置交叉编译链工具或者使用cargo-cross来进行交叉编译。但是仍然不清楚在使用rust-lld时,如何使gnu方式的target编译成功

--
👇
c00t: 另外,我提到的zig cc这个选项只有zig和rust同时支持这个arch的时候才能起作用,它们两个支持的arch集合还不是包含关系,在某些奇怪的组合下,zig cc没法作为linker

作者 ciallomino 2022-09-19 14:43

谢谢解答,现在搞清楚了musl和gnu的差异,我现在可以通过设置交叉编译链工具或者使用cargo-cross来进行交叉编译。但是仍然不清楚在使用rust-lld时,如何使gnu方式的target编译成功

--
👇
c00t: 另外,我提到的zig cc这个选项只有zig和rust同时支持这个arch的时候才能起作用,它们两个支持的arch集合还不是包含关系,在某些奇怪的组合下,zig cc没法作为linker

c00t 2022-09-16 20:39

另外,我提到的zig cc这个选项只有zig和rust同时支持这个arch的时候才能起作用,它们两个支持的arch集合还不是包含关系,在某些奇怪的组合下,zig cc没法作为linker

c00t 2022-09-16 20:34

我之前在 Cross compile for aarch64-unknown-linux-gnu on Windows 里回答过了,musl libc和gnu libc惯例的使用方式是不一样的,用musl,通常是静态链接的,而gnu,由于在大量发行版都存在,并且有的发行版甚至会出特定的patch,所以一般都是动态链接的(这个问题可以看经典的《程序装载与库》那本老书,大概原理是通用的),报错是因为链接的时候少了object文件里的相关信息

话说,真的很不建议在Windows上搞这些

1 共 4 条评论, 1 页