如何使用glibc而不是musl使用rustc创建静态可执行文件?

如何使用glibc而不是musl使用rustc创建静态可执行文件?,rust,runtime,static-linking,libc,Rust,Runtime,Static Linking,Libc,我用C语言编写了简单的代码 富科 福斯 fn main(){ println!(“你好”); } 然后我把它们都造出来了 $gcc-static-o cfoo foo.c $go构建-o gofoo foo.go $rustc-o rustfoo.rs 它们运行良好 $./cfoo/gofoo/鲁斯特福 你好 你好 你好 Rust可执行文件的二进制文件与其他两个文件相比太小,所以我怀疑它不是静态可执行文件 $ls-l cfoo gofoo rustfoo -rwxr-xr-x 1-7557

我用C语言编写了简单的代码

富科

福斯

fn main(){
println!(“你好”);
}
然后我把它们都造出来了

$gcc-static-o cfoo foo.c
$go构建-o gofoo foo.go
$rustc-o rustfoo.rs
它们运行良好

$./cfoo/gofoo/鲁斯特福
你好
你好
你好
Rust可执行文件的二进制文件与其他两个文件相比太小,所以我怀疑它不是静态可执行文件

$ls-l cfoo gofoo rustfoo
-rwxr-xr-x 1-755744 10月23日21:17 cfoo
-rwxr-xr-x 1 lone lone 1906945 10月23日21:17 gofoo
-rwxr-xr-x 1 lone lone 253528 10月23日21:17 rustfoo
我确认Rust不会生成静态可执行文件

$ldd cfoo gofoo rustfoo
cfoo:
不是动态可执行文件
戈福:
不是动态可执行文件
rustfoo:
linux vdso.so.1(0x00007ffe6dfb7000)
libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007fd8d9b75000)
librt.so.1=>/lib/x86_64-linux-gnu/librt.so.1(0x00007fd8d9b6b000)
libpthread.so.0=>/lib/x86_64-linux-gnu/libpthread.so.0(0x00007fd8d9b4a000)
libgcc_.so.1=>/lib/x86_64-linux-gnu/libgcc_.so.1(0x00007fd8d9b30000)
libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007fd8d996f000)
/lib64/ld-linux-x86-64.so.2(0x00007fd8d9bbb000)
有没有办法为Rust生成一个静态可执行文件


我检查了其他类似的答案,他们谈论使用musl。没有办法用glibc生成静态可执行文件吗?如果我必须使用另一种方法,您能否提供一个逐步生成静态可执行文件的命令,
rustc

您需要为MUSL编译,否则Rust将取决于您的libc


自从最初回答这个问题以来,情况似乎发生了变化

首先,您需要确保您的系统上有一个静态链接的glibc。我使用的是RHEL系统,所以我使用了:

sudo yum install glibc-static
我相信Ubuntu/Debian的等价物是:

sudo apt-get install libc6-dev
然后,在编译程序时,将选项
-C target feature=+crt static
传递给RUSC:

$ rustc -o rustfoo -C target-feature=+crt-static main.rs
$ ldd rustfoo
        not a dynamic executable
当然,很少有人用手来管理rustc。您可以使用
RUSTFLAGS
环境变量指示cargo将此选项传递给rustc,如下所示:

RUSTFLAGS="-C target-feature=+crt-static" cargo build --target x86_64-unknown-linux-gnu
即使是为主机平台构建,也必须添加
--target
选项的原因是,如果不添加,则在构建编译时代码(如proc宏等)时,将应用通过
RUSTFLAGS
提供的选项,这可能会导致编译失败。如果明确指定目标平台,则仅在为目标平台编译代码时应用
RUSTFLAGS
。另见

如果您希望它始终像这样静态构建,而不需要环境变量,那么您可以在project top目录中创建一个文件
.cargo/config.toml
,并将以下内容放入其中:

[build]
rustflags = ["-C", "target-feature=+crt-static"]
target = "x86_64-unknown-linux-gnu"
参考资料:


您尝试过这个答案吗@FrenchBoiethios该答案适用于Windows。另请参阅,您的系统上是否有glibc的静态版本?@Shepmaster我如何检查我的系统上是否有glibc的静态版本<代码>apt缓存搜索glibc | grep static未显示任何结果。但是在我的系统上有
/usr/lib/x86_64-linux-gnu/libc.a
。另外,正如我在上面的问题中解释的那样,
gcc-static-ocfoo.c
生成一个静态二进制文件。所以我猜我的系统上存在静态glibc。我说的对吗?太棒了!目前,proc宏板条箱存在问题。解决方法是始终指定target
RUSTFLAGS=“-C target feature=+crt static”货物构建--target x86_64-unknown-linux-gnu--release
。更多关于这个问题的信息,请访问github:Good catch@michalhosna。我已经更新了答案以包含该信息。
[build]
rustflags = ["-C", "target-feature=+crt-static"]
target = "x86_64-unknown-linux-gnu"