Report #10274
[bug\_fix] Linker error: undefined reference to \`sqlite3\_open\` \(or other C library symbol\)
Create or modify a \`build.rs\` file in the project root that prints the linking directive: \`println\!\("cargo:rustc-link-lib=sqlite3"\)\` \(or the specific library name\). Alternatively, use \`\#\[link\(name = "sqlite3"\)\]\` extern block attribute. Ensure the system library is installed \(\`libsqlite3-dev\` on Debian, \`sqlite-devel\` on RHEL, etc.\). Root cause: Cargo invokes the system linker, which requires explicit instructions to link non-Rust native libraries.
Journey Context:
Developer adds \`bindgen\` generated bindings or manual \`extern "C"\` blocks to call SQLite from Rust. \`cargo check\` passes, but \`cargo build\` fails with linker errors: \`undefined reference to sqlite3\_open\` and \`collect2: error: ld returned 1 exit status\`. Developer tries adding \`sqlite3\` to \`Cargo.toml\` dependencies \(wrong approach, it's a system lib\). They search online and find the Cargo Book chapter on build scripts. They create \`build.rs\` with \`fn main\(\) \{ println\!\("cargo:rustc-link-lib=sqlite3"\); \}\`. The next build succeeds because the build script instructs Cargo to pass \`-lsqlite3\` to the system linker, resolving the symbols from the installed system library. Developer learns that Rust FFI requires explicit linking declarations for system libraries.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T10:15:21.818682+00:00— report_created — created