Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Missing Downloaded Libraries? #1763

Answered by Nickalus12
AidFTech asked this question in Q&A
Discussion options

I'm trying to cross-compile a Rust program for Raspberry Pi (aarch64), but kept getting errors for missing alsa and libssl libraries. I was able to install the arm64 version of those packages but still got the error, even though the PKG_CONFIG_PATH directory /usr/lib/aarch64-linux-gnu/pkgconfig contains alsa.pc and libssl.pc. What else am I missing? Thanks in advance!

info: syncing channel updates for stable-x86_64-unknown-linux-gnu
 stable-x86_64-unknown-linux-gnu unchanged - rustc 1.94.1 (e408947bf 2026年03月25日)
info: checking for self-update (current version: 1.29.0)
 Compiling alsa-sys v0.3.1
 Compiling openssl-sys v0.9.104
error: failed to run custom build command for `alsa-sys v0.3.1`
Caused by:
 process didn't exit successfully: `/target/debug/build/alsa-sys-2b9ba8b0469fbf0a/build-script-build` (exit status: 101)
 --- stdout
 cargo:rerun-if-env-changed=ALSA_NO_PKG_CONFIG
 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS
 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS
 cargo:rerun-if-env-changed=PKG_CONFIG_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
 cargo:rerun-if-env-changed=PKG_CONFIG
 cargo:rerun-if-env-changed=ALSA_STATIC
 cargo:rerun-if-env-changed=ALSA_DYNAMIC
 cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
 cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
 cargo:rerun-if-env-changed=PKG_CONFIG_PATH_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_PATH_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_PATH
 cargo:rerun-if-env-changed=PKG_CONFIG_PATH
 cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_LIBDIR
 cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
 --- stderr
 thread 'main' (22) panicked at /cargo/registry/src/index.crates.io-1949cf8c6b5b557f/alsa-sys-0.3.1/build.rs:13:18:
 pkg-config exited with status code 1
 > PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/: PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags alsa
 The system library `alsa` required by crate `alsa-sys` was not found.
 The file `alsa.pc` needs to be installed and the PKG_CONFIG_PATH environment variable must contain its parent directory.
 PKG_CONFIG_PATH contains the following:
 - /usr/lib/aarch64-linux-gnu/pkgconfig/
 - 
 HINT: you may need to install a package such as alsa, alsa-dev or alsa-devel.
 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
warning: openssl-sys@0.9.104: Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge. If OpenSSL is installed and this crate had trouble finding it, you can set the `OPENSSL_DIR` environment variable for the compilation process. See stderr section below for further information.
error: failed to run custom build command for `openssl-sys v0.9.104`
Caused by:
 process didn't exit successfully: `/target/debug/build/openssl-sys-72a09bd6b6f9c09a/build-script-main` (exit status: 101)
 --- stdout
 cargo:rustc-check-cfg=cfg(osslconf, values("OPENSSL_NO_OCB", "OPENSSL_NO_SM4", "OPENSSL_NO_SEED", "OPENSSL_NO_CHACHA", "OPENSSL_NO_CAST", "OPENSSL_NO_IDEA", "OPENSSL_NO_CAMELLIA", "OPENSSL_NO_RC4", "OPENSSL_NO_BF", "OPENSSL_NO_PSK", "OPENSSL_NO_DEPRECATED_3_0", "OPENSSL_NO_SCRYPT", "OPENSSL_NO_SM3", "OPENSSL_NO_RMD160", "OPENSSL_NO_EC2M", "OPENSSL_NO_OCSP", "OPENSSL_NO_CMS", "OPENSSL_NO_COMP", "OPENSSL_NO_SOCK", "OPENSSL_NO_STDIO", "OPENSSL_NO_EC", "OPENSSL_NO_SSL3_METHOD", "OPENSSL_NO_KRB5", "OPENSSL_NO_TLSEXT", "OPENSSL_NO_SRP", "OPENSSL_NO_RFC3779", "OPENSSL_NO_SHA", "OPENSSL_NO_NEXTPROTONEG", "OPENSSL_NO_ENGINE", "OPENSSL_NO_BUF_FREELISTS"))
 cargo:rustc-check-cfg=cfg(openssl)
 cargo:rustc-check-cfg=cfg(libressl)
 cargo:rustc-check-cfg=cfg(boringssl)
 cargo:rustc-check-cfg=cfg(libressl250)
 cargo:rustc-check-cfg=cfg(libressl251)
 cargo:rustc-check-cfg=cfg(libressl252)
 cargo:rustc-check-cfg=cfg(libressl261)
 cargo:rustc-check-cfg=cfg(libressl270)
 cargo:rustc-check-cfg=cfg(libressl271)
 cargo:rustc-check-cfg=cfg(libressl273)
 cargo:rustc-check-cfg=cfg(libressl280)
 cargo:rustc-check-cfg=cfg(libressl281)
 cargo:rustc-check-cfg=cfg(libressl291)
 cargo:rustc-check-cfg=cfg(libressl310)
 cargo:rustc-check-cfg=cfg(libressl321)
 cargo:rustc-check-cfg=cfg(libressl332)
 cargo:rustc-check-cfg=cfg(libressl340)
 cargo:rustc-check-cfg=cfg(libressl350)
 cargo:rustc-check-cfg=cfg(libressl360)
 cargo:rustc-check-cfg=cfg(libressl361)
 cargo:rustc-check-cfg=cfg(libressl370)
 cargo:rustc-check-cfg=cfg(libressl380)
 cargo:rustc-check-cfg=cfg(libressl381)
 cargo:rustc-check-cfg=cfg(libressl382)
 cargo:rustc-check-cfg=cfg(libressl390)
 cargo:rustc-check-cfg=cfg(libressl400)
 cargo:rustc-check-cfg=cfg(ossl101)
 cargo:rustc-check-cfg=cfg(ossl102)
 cargo:rustc-check-cfg=cfg(ossl102f)
 cargo:rustc-check-cfg=cfg(ossl102h)
 cargo:rustc-check-cfg=cfg(ossl110)
 cargo:rustc-check-cfg=cfg(ossl110f)
 cargo:rustc-check-cfg=cfg(ossl110g)
 cargo:rustc-check-cfg=cfg(ossl110h)
 cargo:rustc-check-cfg=cfg(ossl111)
 cargo:rustc-check-cfg=cfg(ossl111b)
 cargo:rustc-check-cfg=cfg(ossl111c)
 cargo:rustc-check-cfg=cfg(ossl111d)
 cargo:rustc-check-cfg=cfg(ossl300)
 cargo:rustc-check-cfg=cfg(ossl310)
 cargo:rustc-check-cfg=cfg(ossl320)
 cargo:rustc-check-cfg=cfg(ossl330)
 cargo:rustc-check-cfg=cfg(ossl340)
 cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
 AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
 cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
 OPENSSL_LIB_DIR unset
 cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
 AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
 cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
 OPENSSL_INCLUDE_DIR unset
 cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
 AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
 cargo:rerun-if-env-changed=OPENSSL_DIR
 OPENSSL_DIR unset
 cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS
 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS
 cargo:rerun-if-env-changed=PKG_CONFIG_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
 cargo:rerun-if-env-changed=PKG_CONFIG
 cargo:rerun-if-env-changed=OPENSSL_STATIC
 cargo:rerun-if-env-changed=OPENSSL_DYNAMIC
 cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
 cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
 cargo:rerun-if-env-changed=PKG_CONFIG_PATH_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_PATH_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_PATH
 cargo:rerun-if-env-changed=PKG_CONFIG_PATH
 cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_LIBDIR
 cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64-unknown-linux-gnu
 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu
 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
 Could not find openssl via pkg-config:
 pkg-config exited with status code 1
 > PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/: PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags openssl
 The system library `openssl` required by crate `openssl-sys` was not found.
 The file `openssl.pc` needs to be installed and the PKG_CONFIG_PATH environment variable must contain its parent directory.
 PKG_CONFIG_PATH contains the following:
 - /usr/lib/aarch64-linux-gnu/pkgconfig/
 - 
 HINT: you may need to install a package such as openssl, openssl-dev or openssl-devel.
 cargo:warning=Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge. If OpenSSL is installed and this crate had trouble finding it, you can set the `OPENSSL_DIR` environment variable for the compilation process. See stderr section below for further information.
 --- stderr
 Could not find directory of OpenSSL installation, and this `-sys` crate cannot
 proceed without this knowledge. If OpenSSL is installed and this crate had
 trouble finding it, you can set the `OPENSSL_DIR` environment variable for the
 compilation process.
 Make sure you also have the development packages of openssl installed.
 For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.
 If you're in a situation where you think the directory *should* be found
 automatically, please open a bug at https://github.com/sfackler/rust-openssl
 and include information about your system as well as this message.
 $HOST = x86_64-unknown-linux-gnu
 $TARGET = aarch64-unknown-linux-gnu
 openssl-sys = 0.9.104
You must be logged in to vote

The reason you are encountering this error is that cross runs your build inside a container. While you may have installed the aarch64 libraries on your host machine, they are not visible to the compiler inside the isolated build environment.

To fix this, you need to provide a custom Docker image to cross that contains the necessary development headers and libraries for your target architecture.

1. Create a Custom Dockerfile

Create a file named Dockerfile.aarch64 in your project root. You will extend the default cross image for your target and install the required packages using dpkg architecture support.

ARG CROSS_BASE_IMAGE
FROM $CROSS_BASE_IMAGE
# Add the foreign architecture and insta...

Replies: 1 comment 2 replies

Comment options

The reason you are encountering this error is that cross runs your build inside a container. While you may have installed the aarch64 libraries on your host machine, they are not visible to the compiler inside the isolated build environment.

To fix this, you need to provide a custom Docker image to cross that contains the necessary development headers and libraries for your target architecture.

1. Create a Custom Dockerfile

Create a file named Dockerfile.aarch64 in your project root. You will extend the default cross image for your target and install the required packages using dpkg architecture support.

ARG CROSS_BASE_IMAGE
FROM $CROSS_BASE_IMAGE
# Add the foreign architecture and install dependencies
RUN dpkg --add-architecture arm64 && \
 apt-get update && \
 apt-get install --assume-yes --no-install-recommends \
 libasound2-dev:arm64 \
 libssl-dev:arm64

2. Configure Cross

Tell cross to use this custom image by adding a Cross.toml file to your project root (or adding a section to your Cargo.toml).

[target.aarch64-unknown-linux-gnu]
dockerfile = "Dockerfile.aarch64"

3. Build with the Custom Image

When you run your build command, cross will now build the custom image first and then execute the compilation within that environment where pkg-config can correctly locate the .pc files inside the container's /usr/lib/aarch64-linux-gnu/pkgconfig.

Tip

You generally do not need to manually set PKG_CONFIG_PATH when using this method. The cross base images are pre-configured to point pkg-config to the correct multiarch directories for the target architecture.

Why your host libraries didn't work

By default, cross uses a pre-built image (like ghcr.io/cross-rs/aarch64-unknown-linux-gnu). This image is a "blank slate" regarding non-standard libraries. Even if you see the files on your host at /usr/lib/aarch64-linux-gnu/, the container does not mount that path from your host to avoid environment contamination and ensure reproducibility.

Does your project require any other C dependencies, or are ALSA and OpenSSL the only ones?

You must be logged in to vote
2 replies
Comment options

That fixed the dynamic dependencies but now my project needs to link to a static library, which Cross can't find. I'll open that as a new issue.

Comment options

Glad the dynamic deps are sorted. Static linking with cross can be tricky since the library needs to be built for the target arch and placed where the linker can find it inside the container. Good call opening a separate issue for that.

Answer selected by AidFTech
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet

AltStyle によって変換されたページ (->オリジナル) /