27.7.3.1 构建 C APIClient 端程序

本节提供了编译使用 MySQL C API 的 C 程序的准则。

在 Unix 上编译 MySQLClient 端

此处的示例使用 gcc 作为编译器。在某些系统上(例如,macOS 或 FreeBSD 上的 clang 或 Solaris 上的 Sun Studio),可能需要使用其他编译器。根据需要调整示例。

编译使用 MySQL 头文件的 Client 端程序时,可能需要指定-I选项,以便编译器可以找到它们。例如,如果头文件安装在/usr/local/mysql/include中,请在 compile 命令中使用此选项:

-I/usr/local/mysql/include

您可以将代码与动态或静态 MySQL CClient 端库链接。动态库的基本名称为libmysqlclient,后缀因平台而异(例如,对于 Linux,为.so,对于 macOS,为.dylib)。在所有平台上,静态库均名为libmysqlclient.a

必须使用 link 命令中的-lmysqlclient选项链接 MySQLClient 端。您可能还需要指定-L选项,以告诉链接器在哪里可以找到该库。例如,如果库安装在/usr/local/mysql/lib中,请在链接命令中使用以下选项:

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

路径名称在您的系统上可能有所不同。根据需要调整-I-L选项。

为了简化在 Unix 上编译 MySQL 程序的过程,请使用mysql_config脚本。参见第 4.7.1 节“ mysql_config-编译 Client 端的显示选项”

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 上,默认情况下,链接使用动态库。要链接到静态 Client 端库,请将其路径名添加到 link 命令。例如,如果库位于/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

有关更多信息,请参见第 27.7.3.2 节“使用 pkg-config 构建 C APIClient 端程序”

在 Microsoft Windows 上编译 MySQLClient 端

要指定头文件和库文件的位置,请使用开发环境提供的功能。

要在 Windows 上构建 C APIClient 端,必须链接 CClient 端库以及 Windows ws2_32 套接字库和 Secur32 安全性库。

您可以将代码与动态或静态 MySQL CClient 端库链接:

  • 动态库名为libmysql.dll。此外,使用动态库还需要libmysql.lib静态 importlib。

  • 静态库名为mysqlclient.lib。要与静态 CClient 端库链接,必须使用用于编译 CClient 端库的相同版本的 Visual Studio 编译 Client 端应用程序(对于 Oracle 生成的静态 CClient 端库,Visual Studio 2013 是该版本)。

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

  • 对于来自 MySQL 社区分发版的 MySQL CClient 端库:

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

    • 对于 MySQL 5.7.17 及更低版本
  • 如果链接到静态 CClient 端库,请静态链接到 C 运行时(使用/MT编译器选项)。

    • 如果链接到动态 CClient 端库,请静态或动态链接到 C 运行时(使用/MT/MD编译器选项)。
  • 对于来自商业发行版 MySQL 的 MySQL CClient 端库:

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

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

通常,在链接到静态 MySQL CClient 端库时,在链接 C 运行时时,Client 端库和 Client 端应用程序必须使用相同的编译器选项-也就是说,如果您的 CClient 端库是使用/MT选项编译的,您的 Client 端应用程序也应使用/MT选项进行编译,依此类推(有关更多详细信息,请参见描述 C 库链接选项的 MSDN 页面)。从 MySQL 的源分发版构建自己的静态 MySQL CClient 端库并将 Client 端应用程序链接到该库时,请遵循此规则。

Note

*调试模式:由于上述链接规则,您无法在调试模式下(使用/MTd/MDd编译器选项)构建应用程序,并将其链接到 Oracle 构建的静态 CClient 端库,该库不是内置的。与调试选项。相反,您必须使用调试选项从源代码构建静态 Client 端库。

对链接到 MySQLClient 端库的问题进行故障排除

MySQLClient 端库包括内置的 SSL 支持。在链接时无需指定-lssl-lcrypto。这样做实际上可能导致运行时出现问题。

如果链接器找不到 MySQLClient 端库,则对于以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 *table 示 Client 端库所在目录的路径名。要确定正确的目录,请尝试以下命令:

mysql_config --libs

mysql_config的输出可能还指示应该在链接命令上指定的其他库。您可以使用反引号将mysql_config输出直接包含在编译或链接命令中。例如:

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

如果在链接时发生错误,即未定义floor符号,请通过在编译/链接行的末尾添加-lm链接到 math 库。同样,如果您对系统上应存在的其他函数(例如connect())遇到未定义的引用错误,请查看手册页中所涉及的函数,以确定应将哪些库添加到链接命令中。

如果对于系统上不存在的功能,出现诸如以下的未定义引用错误,则通常意味着您的 MySQLClient 端库是在与您的系统不 100%兼容的系统上编译的:

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

在这种情况下,您应该下载最新版本的 MySQL 的源发行版,然后自己编译 MySQLClient 端库。参见第 2.9 节“从源代码安装 MySQL”