3.2 建置 C API 用戶端程式

本節提供編譯使用 MySQL C API 的 C 程式的指南。

在 Unix 上編譯 MySQL 用戶端

此處的範例使用 gcc 作為編譯器。在某些系統上,不同的編譯器可能更適合 (例如,macOS 或 FreeBSD 上的 clang,或 Solaris 上的 Sun Studio)。請根據需要調整範例。

當您編譯使用 MySQL 標頭檔的用戶端程式時,您可能需要指定 -I 選項,以便編譯器可以找到它們。例如,如果標頭檔安裝在 /usr/local/mysql/include 中,請在編譯命令中使用此選項

-I/usr/local/mysql/include

您可以使用動態或靜態 MySQL C 用戶端程式庫連結您的程式碼。動態程式庫的基礎名稱為 libmysqlclient,而後綴則因平台而異 (例如,Linux 的 .so、macOS 的 .dylib)。靜態程式庫在所有平台上都命名為 libmysqlclient.a

MySQL 用戶端必須在連結命令中使用 -lmysqlclient 選項來連結。您可能還需要指定 -L 選項,以告知連結器在哪裡尋找程式庫。例如,如果程式庫安裝在 /usr/local/mysql/lib 中,請在連結命令中使用這些選項

-L/usr/local/mysql/lib -lmysqlclient

路徑名稱在您的系統上可能有所不同。請根據需要調整 -I-L 選項。

為了簡化在 Unix 上編譯 MySQL 程式的過程,請使用 mysql_config 指令碼。請參閱 mysql_config — 顯示編譯用戶端的選項

mysql_config 顯示編譯或連結所需的選項

mysql_config --cflags
mysql_config --libs

您可以在命令列中叫用這些命令,以取得適當的選項並手動將它們新增至編譯或連結命令。或者,使用反引號將 mysql_config 的輸出直接包含在命令列中

gcc -c `mysql_config --cflags` progname.c
gcc -o progname progname.o `mysql_config --libs`

在 Unix 上,連結預設使用動態程式庫。若要改為連結至靜態用戶端程式庫,請將其路徑名稱新增至連結命令。例如,如果程式庫位於 /usr/local/mysql/lib 中,請像這樣連結

gcc -o progname progname.o /usr/local/mysql/lib/libmysqlclient.a

或者,使用 mysql_config 來提供程式庫的路徑

gcc -o progname progname.o `mysql_config --variable=pkglibdir`/libmysqlclient.a

mysql_config 目前沒有提供列出靜態連結所需的所有程式庫的方法,因此可能需要在連結命令中命名其他程式庫 (例如,Solaris 上的 -lnsl -lsocket)。若要瞭解要新增哪些程式庫,請使用 mysql_config --libsldd libmysqlclient.so (或 macOS 上的 otool -L libmysqlclient.dylib)。

pkg-config 可以作為 mysql_config 的替代方案,用於取得資訊,例如編譯器旗標或編譯 MySQL 應用程式所需的連結程式庫。例如,以下成對的命令是等效的

mysql_config --cflags
pkg-config --cflags mysqlclient

mysql_config --libs
pkg-config --libs mysqlclient

若要產生靜態連結的旗標,請使用此命令

pkg-config --static --libs mysqlclient

如需詳細資訊,請參閱第 3.3 節,「使用 pkg-config 建置 C API 用戶端程式」

在 Microsoft Windows 上編譯 MySQL 用戶端

若要指定標頭和程式庫檔案位置,請使用您的開發環境提供的工具。

若要在 Windows 上建置 C API 用戶端,您必須連結 C 用戶端程式庫,以及 Windows ws2_32 套接字程式庫和 Secur32 安全性程式庫。

您可以使用動態或靜態 MySQL C 用戶端程式庫連結您的程式碼

  • 動態程式庫命名為 libmysql.dll。此外,使用動態程式庫還需要 libmysql.lib 靜態匯入程式庫。

  • 靜態程式庫命名為 mysqlclient.lib。若要連結靜態 C 用戶端程式庫,用戶端應用程式必須使用與編譯 C 用戶端程式庫相同的 Visual Studio 版本進行編譯 (Oracle 建置的靜態 C 用戶端程式庫使用 Visual Studio 2015)。

當使用 Oracle 建置的 MySQL C 用戶端程式庫時,當連結用戶端應用程式的 C 執行階段時,請遵循這些規則

  • 對於來自 MySQL 社群版本的 MySQL C 用戶端程式庫

    • 無論您是連結至靜態還是動態 C 用戶端程式庫,都應始終動態連結至 C 執行階段 (使用 /MD 編譯器選項)。此外,執行用戶端應用程式的目標主機必須安裝 Visual C++ Redistributable for Visual Studio 2015

  • 對於來自 MySQL 商業版本的 MySQL C 用戶端程式庫

    • 如果連結至靜態 C 用戶端程式庫,請靜態連結至 C 執行階段 (使用 /MT 編譯器選項)。

    • 如果連結至動態 C 用戶端程式庫,請靜態或動態連結至 C 執行階段 (使用 /MT/MD 編譯器選項)。

一般而言,當連結至靜態 MySQL C 用戶端程式庫時,當連結 C 執行階段時,用戶端程式庫和用戶端應用程式必須使用相同的編譯器選項,也就是說,如果您的 C 用戶端程式庫是使用 /MT 選項編譯的,則您的用戶端應用程式也應該使用 /MT 選項進行編譯,依此類推 (請參閱 描述 C 程式庫連結選項的 MSDN 頁面 以取得更多詳細資訊)。當您從 MySQL 的來源版本建置您自己的靜態 MySQL C 用戶端程式庫,並將您的用戶端應用程式連結至它時,請遵循此規則。

注意

除錯模式:由於剛才提到的連結規則,您無法在除錯模式中建置您的應用程式 (使用 /MTd/MDd 編譯器選項),並將其連結至由 Oracle 建置的靜態 C 用戶端程式庫,該程式庫並非使用除錯選項建置。相反地,您必須使用除錯選項從來源建置靜態用戶端程式庫。

疑難排解連結至 MySQL 用戶端程式庫的問題

MySQL 用戶端程式庫內建 SSL 支援。在連結時無需指定 -lssl-lcrypto。這樣做實際上可能會在執行階段導致問題。

如果連結器找不到 MySQL 用戶端程式庫,您可能會收到以 mysql_ 開頭的符號的未定義參考錯誤,例如這裡顯示的那些錯誤

/tmp/ccFKsdPa.o: In function `main':
/tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init'
/tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect'
/tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error'
/tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'

您應該可以在連結命令結尾新增 -Ldir_path -lmysqlclient 來解決此問題,其中 dir_path 代表用戶端程式庫所在目錄的路徑名稱。若要判斷正確的目錄,請嘗試以下命令

mysql_config --libs

mysql_config 的輸出可能也表示連結命令中應指定的其他程式庫。您可以使用反引號將 mysql_config 輸出直接包含在您的編譯或連結命令中。例如

gcc -o progname progname.o `mysql_config --libs`

如果在連結時發生 floor 符號未定義的錯誤,請將 -lm 新增至編譯/連結行的結尾,以連結至數學程式庫。同樣地,如果您收到應該存在於您系統上的其他函式的未定義參考錯誤,例如 connect(),請檢查相關函式的手冊頁面,以判斷您應該將哪些程式庫新增至連結命令。

如果您收到未定義參考錯誤,例如以下列出的您系統上不存在的函式的錯誤,通常表示您的 MySQL 用戶端程式庫是在與您的系統並非 100% 相容的系統上編譯的

mf_format.o(.text+0x201): undefined reference to `__lxstat'

在這種情況下,您應該下載最新版本的 MySQL 的來源版本,並自行編譯 MySQL 用戶端程式庫。請參閱從來源安裝 MySQL