本節提供編譯使用 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 套接字程式庫和 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 用戶端程式庫是在與您的系統並非 100% 相容的系統上編譯的
mf_format.o(.text+0x201): undefined reference to `__lxstat'
在這種情況下,您應該下載最新版本的 MySQL 的來源版本,並自行編譯 MySQL 用戶端程式庫。請參閱從來源安裝 MySQL。