本節提供編譯使用 MySQL C API 的 C 程式的指南。
此處的範例使用 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 --libs 和 ldd 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 客戶端程式」。
若要指定標頭和程式庫檔案位置,請使用您的開發環境提供的功能。
若要在 Windows 上建置 C API 用戶端,您必須連結 C 用戶端程式庫,以及 Windows ws2_32 sockets 程式庫和 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 用戶端程式庫內建 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'
您應該可以透過在連結命令結尾新增 -L
來解決此問題,其中 dir_path
-lmysqlclientdir_path
代表用戶端程式庫所在目錄的路徑名稱。若要判斷正確的目錄,請嘗試此命令
mysql_config --libs
mysql_config 的輸出可能也會指出應該在連結命令中指定的其他程式庫。您可以使用反引號將 mysql_config 輸出直接包含在您的編譯或連結命令中。例如
gcc -o progname progname.o `mysql_config --libs`
如果在連結時發生 floor
符號未定義的錯誤,請在編譯/連結行的末尾加上 -lm
來連結數學函式庫。同樣地,如果對於您系統上應該存在的其他函式(例如 connect()
)出現未定義的參照錯誤,請查閱相關函式的手冊頁,以確定您應該在連結命令中加入哪些函式庫。
如果您對於系統上不存在的函式收到類似以下的未定義參照錯誤,通常表示您的 MySQL 用戶端函式庫是在與您的系統不完全相容的系統上編譯的。
mf_format.o(.text+0x201): undefined reference to `__lxstat'
在這種情況下,您應該下載最新版本 MySQL 的原始碼發行版,並自行編譯 MySQL 用戶端函式庫。請參閱從原始碼安裝 MySQL。