Fix rustup failed with "error: linker `cc` not found" on Alpine Linux 3.17 (Rust 1.66)

nabbisen - Jan 9 '23 - - Dev Community

Summary

Alpine Linux offers Rustup package as well as Rust.

I built the development environment of Rust on Alpine Linux with Docker.

Well, on the way, I met the error below when testing a cargo project:

$ cargo run
Enter fullscreen mode Exit fullscreen mode

The output was:

   Compiling alpine-rust-example v0.1.0 (/(...)/alpine-rust-example)
error: linker `cc` not found
  |
  = note: No such file or directory (os error 2)

error: could not compile `alpine-rust-example` due to previous error
Enter fullscreen mode Exit fullscreen mode

This post shows how to fix it.

Environment

  • Alpine Linux 3.17
  • Rust 1.66
  • Rustup 1.25

Solution

* Below, doas can be replaced with sudo.

Start Docker container

Dockerfile example:

FROM alpine:3.17

# ports published
EXPOSE 80
EXPOSE 443
# packages base
RUN apk update --no-cache
RUN apk upgrade --no-cache
RUN apk add --no-cache openrc
# rust
RUN apk add --no-cache rustup

# [ init system - activate OpenRC ]
ENTRYPOINT ["/sbin/init"]
Enter fullscreen mode Exit fullscreen mode

Docker command line examples:

$ # build in the directory where Dockerfile exists
$ docker build .
$ # get the image id
$ docker image ls

$ # start container
$ docker start $IMAGE_ID
$ # get the container id
$ docker container ls

$ # enter vm
$ docker exec -it $CONTAINER_ID sh
Enter fullscreen mode Exit fullscreen mode

Install Rust via Rustup

$ doas apk add rustup
Enter fullscreen mode Exit fullscreen mode

The output was:

fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz
(1/6) Installing ca-certificates (20220614-r3)
(2/6) Installing brotli-libs (1.0.9-r9)
(3/6) Installing nghttp2-libs (1.51.0-r0)
(4/6) Installing libcurl (7.87.0-r0)
(5/6) Installing libgcc (12.2.1_git20220924-r4)
(6/6) Installing rustup (1.25.1-r0)
Executing busybox-1.35.0-r29.trigger
Executing ca-certificates-20220614-r3.trigger
OK: 18 MiB in 24 packages
Enter fullscreen mode Exit fullscreen mode

Then run:

$ rustup-init
Enter fullscreen mode Exit fullscreen mode

You will be asked as below. Proceed with the default option:

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /(...)/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory is located at:

  /(...)/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /(...)/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile file located at:

  /(...)/.profile

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-unknown-linux-musl
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
Enter fullscreen mode Exit fullscreen mode

The output was:

info: profile set to 'default'
info: default host triple is x86_64-unknown-linux-musl
info: syncing channel updates for 'stable-x86_64-unknown-linux-musl'
info: latest update on 2022-12-15, rust version 1.66.0 (69f9c33d7 2022-12-12)
info: downloading component 'cargo'
(...)
info: downloading component 'clippy'
(...)
info: downloading component 'rust-docs'
(...)
info: downloading component 'rust-std'
(...)
info: downloading component 'rustc'
(...)
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
(...)
info: installing component 'rust-std'
(...)
info: installing component 'rustc'
(...)
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-unknown-linux-musl'

  stable-x86_64-unknown-linux-musl installed - rustc 1.66.0 (69f9c33d7 2022-12-12)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, run:
source "$HOME/.cargo/env"
Enter fullscreen mode Exit fullscreen mode

Lastly, run to update $PATH:

$ source "$HOME/.cargo/env"
Enter fullscreen mode Exit fullscreen mode

Now Rust is in your hands :)

Create a cargo project (and building it will fail)

Create an example project:

$ cargo new alpine-rust-example
Enter fullscreen mode Exit fullscreen mode

The output was:

     Created binary (application) `alpine-rust-example` package
Enter fullscreen mode Exit fullscreen mode

Enter:

$ cd alpine-rust-example
Enter fullscreen mode Exit fullscreen mode

Then run:

$ cargo run
Enter fullscreen mode Exit fullscreen mode

It will fail with:

   Compiling alpine-rust-example v0.1.0 (/(...)/alpine-rust-example)
error: linker `cc` not found
  |
  = note: No such file or directory (os error 2)

error: could not compile `alpine-rust-example` due to previous error
Enter fullscreen mode Exit fullscreen mode

Fix it

You can fix it by installing build-base package:

# apk add build-base
# #apk add gcc       # alternative (not recomended)
Enter fullscreen mode Exit fullscreen mode

The output was:

fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz
(1/19) Installing libstdc++ (12.2.1_git20220924-r4)
(2/19) Installing binutils (2.39-r2)
(3/19) Installing libmagic (5.43-r0)
(4/19) Installing file (5.43-r0)
(5/19) Installing libgomp (12.2.1_git20220924-r4)
(6/19) Installing libatomic (12.2.1_git20220924-r4)
(7/19) Installing gmp (6.2.1-r2)
(8/19) Installing isl25 (0.25-r0)
(9/19) Installing mpfr4 (4.1.0-r0)
(10/19) Installing mpc1 (1.2.1-r1)
(11/19) Installing gcc (12.2.1_git20220924-r4)
(12/19) Installing libstdc++-dev (12.2.1_git20220924-r4)
(13/19) Installing musl-dev (1.2.3-r4)
(14/19) Installing libc-dev (0.7.2-r3)
(15/19) Installing g++ (12.2.1_git20220924-r4)
(16/19) Installing make (4.3-r1)
(17/19) Installing fortify-headers (1.1-r1)
(18/19) Installing patch (2.7.6-r8)
(19/19) Installing build-base (0.5-r3)
Executing busybox-1.35.0-r29.trigger
OK: 254 MiB in 43 packages
Enter fullscreen mode Exit fullscreen mode

Note: Why build-base instead of gcc

The minimal installation required is just gcc. It's a part of build-base.
gcc may be able to fix the problem in this post.

To install only gcc is, however, not recommended, because either musl-dev or libc-dev will be perhaps necessary in addition soon later.

For example, when building an Actix Web server, which is a Rust web framework using actors communication, build-base must be required.

Conclusion

Let's run cargo run (or cargo build) again:

# cargo run
Enter fullscreen mode Exit fullscreen mode

Will surely get a little happier :)

   Compiling alpine-rust-example v0.1.0 (/(...)/alpine-rust-example)
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `target/debug/alpine-rust-example`
Hello, world!
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .