缺少鏈接庫路徑或庫檔案。
mysql_config --libs
# 輸出範例:-L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lssl -lcrypto
gcc -o myapp myapp.c $(mysql_config --cflags --libs)
undefined reference to `compress`,加 -lz;缺 connect 等系統呼叫,查 man 手冊補對應庫(如 -lsocket -lnsl)。error while loading shared libraries: libmysqlclient.so.21: cannot open shared object file
| 方法 | 操作 | 適用場景 |
|---|---|---|
LD_LIBRARY_PATH | export LD_LIBRARY_PATH=/usr/lib64/mysql:$LD_LIBRARY_PATH | 臨時測試、無 root 權限 |
/etc/ld.so.conf.d/ | 建立 mysql.conf 寫入庫路徑,執行 ldconfig | 永久生效、系統級部署 |
| 複製到系統目錄 | cp libmysqlclient.so* /usr/lib/ && ldconfig | 快速修復、不想改動配置 |
| 靜態鏈接 | gcc -static -o myapp myapp.c $(mysql_config --libs) | 嵌入式、單檔案部署、無動態庫依賴 |
若報 undefined reference to `__lxstat' 等系統符號,說明預編譯二進制與當前 glibc/kernel 版本不兼容。
根治:下載 MySQL 源碼本地編譯 ./configure && make && make install,或使用發布版官方 RPM/DEB 套件。
#!/bin/bash
echo "=== 編譯測試 ==="
gcc -o /tmp/test_mysql $(mysql_config --cflags --libs) <<'EOF'
#include
int main() { MYSQL *m = mysql_init(NULL); return m ? 0 : 1; }
EOF
/tmp/test_mysql && echo "✅ 編譯/鏈接/執行 全通過" || echo "❌ 失敗"