3.2构建C API客户端程序

本节提供编译使用MySQL C API的C程序的指导方针。

在Unix上编译MySQL客户端

这里的例子使用了海湾合作委员会编译器。不同的编译器可能适用于某些系统(例如,铿锵声在macOS或FreeBSD或Solaris上的Sun Studio)。根据需要调整示例。

您可能需要指定一个-我选项,以便编译器能够找到使用MySQL头文件的客户端程序。例如,如果头文件安装在/usr/local/mysql/include,在compile命令中使用此选项:

我/ usr /地方/ mysql /包括

您可以将您的代码链接到动态或静态MySQL C客户端库。动态库基名为libmysqlclient后缀因平台而异(例如,所以对于Linux,. dylibmacOS)。静态库被命名libmysqlclient.a在所有平台上。

MySQL客户端必须使用-lmysqlclient选项。您可能还需要指定一个- l选项告诉链接程序在哪里可以找到库。例如,如果库安装在/usr/local/mysql/lib,在link命令中使用这些选项:

- l / usr /地方/ mysql / lib -lmysqlclient

在您的系统中,路径名称可能不同。调整-我而且- 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——填词”

在Unix上,链接默认使用动态库。要链接到静态客户端库,请将其路径名称添加到link命令中。例如,如果图书馆位于/usr/local/mysql/lib,链接如下:

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

或使用mysql_config提供库的路径:

-o progname progname。o ' mysql_config——变量= pkglibdir ' / libmysqlclient.a

mysql_config目前没有提供列出静态链接所需的所有库的方法,因此可能需要在link命令上命名其他库(例如,-lnsl -lsocket在Solaris)。要了解要添加哪些库,请使用mysql_config——填词而且ldd libmysqlclient.so(或otool - l libmysqlclient.dylib在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++可重分发的Visual Studio 2013安装。

    • MySQL 5.7.17及以下版本

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

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

  • MySQL的商业发行版中的MySQL C客户端库:

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

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

通常,当链接到静态MySQL C客户端库时,当链接到C运行时时,客户端库和客户端应用程序必须使用相同的编译器选项——也就是说,如果您的C客户端库是用每公吨选项,您的客户机应用程序也应该使用每公吨选项,等等(请参见描述C库链接选项的MSDN页面更多的细节)。当您从MySQL的源发行版构建自己的静态MySQL C客户端库并将您的客户端应用程序链接到它时,请遵循此规则。

请注意

调试模式:由于刚才提到的链接规则,您不能在调试模式(使用/ MTd/ MDd编译器选项),并将其链接到Oracle构建的静态C客户端库,即使用调试选项构建。相反,您必须使用调试选项从源代码构建静态客户端库。

链接MySQL客户端库时出现的问题

MySQL客户端库包括内置的SSL支持。没有必要指定其中任何一个-lssl-lcrypto在链接时。这样做实际上可能会在运行时导致问题。

如果链接器找不到MySQL客户端库,您可能会得到未定义引用错误的符号以mysql_,如图中所示:

/ tmp / ccFKsdPa。o:在函数' 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——填词

的输出mysql_config也可能指示应在link命令上指定的其他库。您可以包括mysql_config使用反勾号直接在编译或链接命令中输出。例如:

-o progname progname。o“mysql_config——填词”

如果在链接时发生错误,则地板上符号未定义,通过添加链接到数学库- lm到编译/链接行的末尾。类似地,如果您得到系统中应该存在的其他函数的未定义引用错误,例如connect (),查看相关函数的手册页,以确定应该将哪些库添加到link命令中。

如果你在你的系统中不存在如下的函数的未定义引用错误,这通常意味着你的MySQL客户端库编译在一个与你的系统不100%兼容的系统上:

Mf_format.o (.text+0x201):未定义引用' __lxstat'

在这种情况下,您应该下载MySQL最新版本的源代码发行版,并自己编译MySQL客户端库。看到从Source安装MySQL