You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alpine Linux编译Rocket.rs 0.5-rc2时链接器找不到crti.o

解决Rocket v0.5-rc2在Alpine Linux编译时crti.o缺失问题

问题描述

升级应用至Rocket v0.5-rc2后,在Alpine Linux环境编译时出现链接器错误,提示无法找到crti.o文件,相关配置及报错信息如下:

原Dockerfile

ARG BINARY_NAME=rocketdieselstack
FROM rust:alpine3.16 as builder

RUN rustup update nightly && rustup default nightly
#install dev packages
RUN apk add pcc-libs-dev

#get the sources
ADD  --chown=rust:rust . ./

#build container
RUN cargo build --release

#remove sources
RUN rm src/*.rs

FROM alpine:latest

#environment setup
ARG APP=/usr/src/app
EXPOSE 8000
ENV TZ=Etc/UTC \
    APP_USER=appuser

RUN addgroup -S $APP_USER \
    && adduser -S -g $APP_USER $APP_USER
RUN apk update \
    && apk add --no-cache ca-certificates tzdata bash\
    && rm -rf /var/cache/apk/*
#add group and create directory
RUN mkdir -p ${APP}


COPY --from=builder /home/rust/src/target/x86_64-unknown-linux-musl/release/${BINARY_NAME} ${APP}/${BINARY_NAME}
RUN chown -R $APP_USER:$APP_USER ${APP}

USER ${APP_USER}

WORKDIR ${APP}
CMD ["./rocketdieselstack"]

编译报错

#14 ERROR: executor failed running [/bin/sh -c cargo build --release]: exit code: 101
------
 > [builder 5/6] RUN cargo build --release:
#14 185.1 error: linking with `cc` failed: exit status: 1
#14 185.1   |
#14 185.1   = note: "cc" "-Wl,--version-script=/tmp/rustcyfX4Hz/list" "-m64" "/tmp/rustcyfX4Hz/symbols.o" "/target/release/deps/time_macros-36b840665dbccb38.time_macros.6a053ec9-cgu.0.rcgu.o" ...(省略冗余链接参数)
#14 185.1   = note: /usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find crti.o: No such file or directory
#14 185.1           collect2: error: ld returned 1 exit status
#14 185.1           
#14 185.1 
#14 185.1    Compiling parking_lot v0.12.1
#14 185.2 error: could not compile `time-macros` due to previous error
#14 185.2 warning: build failed, waiting for other jobs to finish...
------

原因分析

crti.o是musl C标准库的初始化目标文件,属于编译基础依赖组件。原Dockerfile仅安装了pcc-libs-dev(PCC编译器的库文件),但Rust工具链依赖GCC/musl工具链,缺少对应的musl-dev和gcc包导致链接器找不到该文件。

解决方案

修改builder阶段的依赖安装命令,替换为Alpine下适配Rust的标准编译依赖包:

修改后的Dockerfile(builder阶段关键部分)

ARG BINARY_NAME=rocketdieselstack
FROM rust:alpine3.16 as builder

RUN rustup update nightly && rustup default nightly
# 替换为gcc和musl-dev,提供完整的编译工具链
RUN apk add gcc musl-dev

#get the sources
ADD  --chown=rust:rust . ./

#build container
RUN cargo build --release

# 后续阶段保持不变...

说明

  • gcc提供Rust链接时所需的GCC工具链支持
  • musl-dev包含musl C标准库的头文件和初始化目标文件(如crti.o),满足静态链接需求
  • 移除pcc-libs-dev,它与Rust默认使用的GCC工具链不兼容

内容的提问来源于stack exchange,提问作者crlsktr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:45:36