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,后缀因平台而异(例如,.so对于 Linux, .dylib对于 macOS)。静态库libmysqlclient.a在所有平台上都被命名。

必须使用 -lmysqlclient链接命令中的选项链接 MySQL 客户端。您可能还需要指定一个-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当前不提供列出静态链接所需的所有库的方法,因此可能需要在链接命令中命名其他库(例如,-lnsl -lsocket在 Solaris 上)。要了解要添加哪些库,请使用mysql_config --libsldd libmysqlclient.so (或otool -L libmysqlclient.dylib on macOS)。

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 2013)。

使用 Oracle 构建的 MySQL C 客户端库时,在为客户端应用程序链接 C 运行时时遵循以下规则:

  • 对于来自 MySQL 社区分发的 MySQL C 客户端库:

    • 对于 MySQL 5.7.18 及更高版本:始终动态链接到 C 运行时(使用 /MD编译器选项),无论您是链接到静态还是动态 C 客户端库。此外,运行客户端应用程序的目标主机必须安装 Visual C++ Redistributable for Visual Studio 2013

    • 对于 MySQL 5.7.17 及更低版本

      • 如果链接到静态 C 客户端库,则静态链接到 C 运行时(使用 /MT编译器选项)。

      • 如果链接到动态 C 客户端库,则静态或动态链接到 C 运行时(使用任一/MT/MD编译器选项)。

  • 对于来自 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 支持。无需在链接时指定-lsslor 。-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 -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