【问题标题】:Why rustc did not include libmariadb into release binary?为什么 rustc 没有将 libmariadb 包含到发布二进制文件中?
【发布时间】:2020-10-05 08:07:53
【问题描述】:

我认为 rust 编译器使用静态绑定并在编译时包含所有依赖库(因此可执行大小)。

但是,当我尝试在 docker 临时映像中使用已编译的二进制文件时,会弹出此错误:

error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or director

我的码头文件:

FROM rust:1.43 as builder
WORKDIR /var/app

RUN apt-get update && apt-get install -y libclang-dev clang libmariadb-dev-compat libmariadb-dev

COPY Cargo.toml Cargo.lock diesel.toml ./
COPY src src

RUN cargo install diesel_cli --no-default-features --features mysql
RUN cp /usr/local/cargo/bin/diesel diesel
RUN cargo build --release

FROM ubuntu
USER 1000
WORKDIR /var/app

COPY --from=builder --chown=1000:1000 /var/app/target/release/sniper_api app
COPY --from=builder --chown=1000:1000 /var/app/diesel diesel

CMD ["./app"]

我的货物:

[dependencies]
actix-rt = "1.0.0"
actix-web = "2.0.0"
actix-http = "1.0.1"
serde = { version = "1.0.112", features=["derive"] }
dotenv = "0.15.0"
config = "0.10.1"
diesel = { version = "1.4.2", features = ["mysql","r2d2"]}
futures = "0.3.5"
r2d2 = "0.8.8"
r2d2_mysql = "18.0.0"
env_logger = "0.7.1"

但是如果我使用 ubuntu/debian/etc。图像作为运行时并安装libmariadb-dev-compat libmariadb-dev 一切都很好。有没有办法在 Rust 中使用 mysql 连接器获得真正的单一二进制文件?

【问题讨论】:

    标签: mysql rust rust-diesel


    【解决方案1】:

    我认为 rust 编译器使用静态绑定并在编译时包含所有依赖库(因此可执行文件大小)。

    这仅适用于 Rust 库。对于其他语言,rustc 能做的事情一般很少。

    特别是在这种情况下,diesel 通过mysqlclient-sys crate 提供mariadb 支持,目前有an issuean accompanying PR 打开以支持此库的静态链接。但它们尚未合并。

    【讨论】:

    • 是否容易生锈,或者这仅发生在某些库中,例如 mysql 连接器?我正在尝试解决这些问题,感觉 postgres 和 sqlite 就可以了。但要确定。
    • 一些 C 或 C++ 库确实更喜欢静态或动态链接,并且一些系统更容易使用动态库,但不是静态库。
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2016-06-07
    • 2020-12-06
    相关资源
    最近更新 更多