为什么在编译动态库之后,Rust libstd动态链接而不使用-C prefer动态标志?

为什么在编译动态库之后,Rust libstd动态链接而不使用-C prefer动态标志?,rust,dynamic-linking,linkage,rust-cargo,Rust,Dynamic Linking,Linkage,Rust Cargo,在构建动态库时,我在理解Cargo如何链接二进制文件方面遇到了一个问题。为了更好地理解它,我尝试构建'ls'changing Cargo.toml和其他东西,使可执行文件尽可能小。我很快发现动态链接库可以大大减少可执行文件的大小 在互联网上搜索优化,我发现当您在Cargo中生成库作为“dylibs”时,它们仍然静态地包含“libstd”,除非您明确告诉编译器使用“-C prefere dynamic”标志动态地包含它 我没有使用这个标志,但仍然动态链接libstd,这很奇怪 货到付款 我稍微修改

在构建动态库时,我在理解Cargo如何链接二进制文件方面遇到了一个问题。为了更好地理解它,我尝试构建'ls'changing Cargo.toml和其他东西,使可执行文件尽可能小。我很快发现动态链接库可以大大减少可执行文件的大小

在互联网上搜索优化,我发现当您在Cargo中生成库作为“dylibs”时,它们仍然静态地包含“libstd”,除非您明确告诉编译器使用“-C prefere dynamic”标志动态地包含它

我没有使用这个标志,但仍然动态链接libstd,这很奇怪

货到付款 我稍微修改了一下

[package]
name = "ls"
version = "0.0.1"
authors = ["Jeremiah Peschka <jeremiah.peschka@gmail.com>"]



[lib]
crate-type=["dylib"]
name = "uu_ls"
path = "ls.rs"

[dependencies]
getopts = "0.2.14"
pretty-bytes = "0.2.1"
term_grid = "0.1.5"
termsize = "0.1.4"
time = "0.1.38"
lazy_static = "0.2.8"
unicode-width = "0.1.4"

[dependencies.uucore]
path = "../uucore"
default-features = false
features = ["entries"]

[[bin]]
name = "ls"
path = "main.rs"
构建库后,我确定它是否动态链接:

ldd~/target/release/libuu\ls.so
linux vdso.so.1=>(0x00007ffd96b98000)
libuucore.so=>未找到
libstd-8eeda694d27cc3ba.so=>/home/cibo/.rustup/toolschains/stable-x86_64-unknown-linux-gnu/lib/libstd-8eeda694d27cc3ba.so(0x00007f86a29d0000)
librt.so.1=>/lib/x86_64-linux-gnu/librt.so.1(0x00007f86a27c8000)
libpthread.so.0=>/lib/x86_64-linux-gnu/libpthread.so.0(0x00007f86a25ab000)
libgcc_.so.1=>/lib/x86_64-linux-gnu/libgcc_.so.1(0x00007f86a2394000)
libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007f86a1fca000)
libm.so.6=>/lib/x86_64-linux-gnu/libm.so.6(0x00007f86a1cc1000)
libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007f86a1abc000)
/lib64/ld-linux-x86-64.so.2(0x0000558ebb132000)

如您所见,libstd在这里是动态链接的

你的问题到底是什么?为什么动态库会动态链接事物?@Neikos为什么标准库会动态链接到动态库?文档中说标准库应该静态链接,除非您为编译器指定标志“-C prefer动态”。在这种情况下,它会动态链接标准库,而当我使用虚拟项目进行测试时,它会按预期工作。您能链接到文档中说明的部分吗?@Neikos。。这不是官方图书馆,但它是Cargo项目的所有者,他解释了我要重新表述的内容here@Neikos您也可以参考本页
[package]
name = "uucore"
version = "0.0.1"
authors = []


[dependencies]
getopts = "0.2.14"
time = { version = "0.1.38", optional = true }
data-encoding = { version = "^1.1", optional = true }

[dependencies.libc]
git = "https://github.com/rust-lang/libc.git"
optional = true

[features]
fs = ["libc"]
utf8 = []
encoding = ["data-encoding"]
parse_time = []
utmpx = ["time", "libc"]
process = ["libc"]
signals = []
entries = ["libc"]
wide = []
utsname = ["libc"]
default = ["fs", "libc", "utf8", "utsname", "encoding", "parse_time", "utmpx", "process", "entries", "signals", "wide"]

[lib]
crate-type=["dylib"]
path = "lib.rs"
name = "uucore"