[笔记] 在Rust中编译静态链接的可执行文件

发布于 2023-05-10  363 次阅读


AI 摘要

摘要:最近,我尝试在Rust中编写小工具,但由于目标环境的复杂性,常规输出的可执行文件经常出现依赖项缺失的问题。为此,我考虑使用静态链接来解决这个问题。最初,我尝试使用musl替代gnu,但在WSL2-Ubuntu22.04环境中遇到了无法找到库的问题。然后,我了解到可以通过给rustc传递"-C target-feature=+crt-static"参数实现静态链接。最终,我成功地使用了环境变量来构建静态链接的可执行文件。这次经历让我认识到自己在C语言和Linux方面还有很多知识欠缺的地方。

最近尝试使用Rust写一些小工具给公司的项目使用,但是因为目标环境有时候比较复杂,正常输出的可执行文件经常会遇到缺少依赖项的问题,所以我就想到了静态输出。

我的第一反应是使用musl代替gnu。但是在尝试了很久之后发现,我的开发环境是WSL2-Ubuntu22.04,在这个环境里面使用musl工具链会有大量的无法找到库的问题。我看到有人提到musl在常见的非musl集成的发行版上面可能需要额外的配置,因为不太了解,我在这个方向上没有花太多时间。

转头看,有人提到了给rustc传递一个-C target-feature=+crt-static参数可以实现静态链接。我最开始是写在Cargo.toml中的,但是build的时候总是提示无用键。最后,使用环境变量的方式,并且成功了。

RUSTFLAGS='-C target-feature=+crt-static' cargo build --release --target x86_64-unknown-linux-gnu

C语言和linux的这些东西我果然还是欠缺太多知识了...