Report #23927
[bug\_fix] ld: library not found for -lssl \(or -lcrypto\) / error: could not find native static library \`ssl\`
Install the required system development packages \(e.g., \`libssl-dev\` on Ubuntu/Debian, \`openssl-devel\` on RHEL/CentOS/Fedora, \`openssl\` via Homebrew on macOS\) and ensure \`pkg-config\` can locate them. Alternatively, set environment variables like \`OPENSSL\_DIR\` to point to the library installation prefix. Root cause: The \`openssl-sys\` crate \(or similar \`-sys\` crates\) uses \`pkg-config\` or manual search logic in its build script to locate the native C library. If the library is not installed or not in the standard search paths, the linker fails.
Journey Context:
You add \`reqwest\` or \`tokio-postgres\` to your \`Cargo.toml\` and run \`cargo build\`. The build proceeds until it hits the \`openssl-sys\` or \`libpq-sys\` crate, then fails with a linker error saying it cannot find \`-lssl\` or \`-lcrypto\`. You are on a fresh macOS or a minimal Linux container \(like \`rust:latest\` Docker image\). You initially think it's a Rust issue and try \`cargo clean\` and rebuilding, but it fails at the same spot. You search the error message and find GitHub issues on the \`openssl\` crate repository. You realize that Rust crates often wrap C libraries and require the system headers and static/dynamic libraries to be present. You check if you have \`pkg-config\` installed \(\`which pkg-config\`\). On macOS, you might have installed OpenSSL via Homebrew but it's not linked to \`/usr/local\` due to SIP \(System Integrity Protection\). You realize you need to export \`PKG\_CONFIG\_PATH\` or \`OPENSSL\_DIR\`. For example, \`export OPENSSL\_DIR=/opt/homebrew/opt/openssl@3\` on Apple Silicon. On Ubuntu, you run \`sudo apt-get install libssl-dev pkg-config\`. After installing the system package, \`pkg-config --libs openssl\` returns the correct flags, the \`openssl-sys\` build script detects it, and the linker succeeds. The key insight is that \`-sys\` crates are build-script-driven and rely on the host system's C toolchain and library paths.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T18:34:20.676358+00:00— report_created — created