我有一个依赖于Hyper和Diesel的项目,因此依赖于本机库OpenSSL和libpq。该项目使用编译器插件,因此需要在nightly Rust上构建。
我目前尝试在Docker容器中构建。 我已经安装了MUSL libc和带有前缀"/usr/local/musl"的库,并运行以下命令:cargo
(不确定某些选项是否冗余,我对编译器链不太熟悉,也不确定它们最终是否传递给链接器,但是我必须尝试一下,对吧。)
LDFLAGS="-static -L/usr/local/musl/lib" \
LD_LIBRARY_PATH=/usr/local/musl/lib:$LD_LIBRARY_PATH \
CFLAGS="-I/usr/local/musl/include" \
PKG_CONFIG_PATH=/usr/local/musl/lib/pkgconfig \
cargo build --release --target=x86_64-unknown-linux-musl
当我运行ldd
命令查看生成的文件时,会显示如下内容:
$ ldd server
linux-vdso.so.1 (0x00007fffb878e000)
libpq.so.5 => /usr/local/musl/lib/libpq.so.5 (0x00007f4d730e7000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f4d72e82000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f4d72a85000)
libc.so => /usr/local/musl/lib/libc.so (0x00007f4d727f6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4d725f2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4d72246000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x000055e2124a2000)
所有这些都是动态链接库,有些甚至是带有“x86_64-linux-gnu”链的!出了什么问题?
我可以创建静态链接的、简单的纯Rust项目而没有任何问题。 ldd
表明它们是静态链接的,并且它们可以运行而没有问题,不像我遇到问题的可执行文件。
当我在Cargo中使用了 --verbose
,我得到了以下实际构建可执行文件的 rustc
命令:http://pastebin.com/ywv0zNBK (哎呀,那个有一个自定义的 outdir
和 -Z print-link-args
,由我添加)。添加了 print-link-args
标志后,我得到了以下链接器命令:http://pastebin.com/Aw43qd7h
我怎样才能让 cargo
或者 rustc
相信我想要一个静态二进制文件呢?
/usr/local/musl
下。我试图通过正确设置环境来获取相应的库以链接到静态版本,但显然我失败了。你所说的方式听起来像是我需要修改库本身,这是你的意思吗? - GolDDranks