本节提供编译使用MySQL C API的C程序的指导方针。
这里的例子使用了海湾合作委员会编译器。不同的编译器可能适用于某些系统(例如,铿锵声在macOS或FreeBSD或Solaris上的Sun Studio)。根据需要调整示例。
您可能需要指定一个-我
选项,以便编译器能够找到使用MySQL头文件的客户端程序。例如,如果头文件安装在/usr/local/mysql/include
,在compile命令中使用此选项:
我/ usr /地方/ mysql /包括
您可以将您的代码链接到动态或静态MySQL C客户端库。动态库基名为libmysqlclient
后缀因平台而异(例如,所以
对于Linux,. dylib
macOS)。静态库被命名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客户端程序”.
要指定头文件和库文件位置,请使用开发环境提供的工具。
要在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客户端库包括内置的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'
你应该可以通过加法来解决这个问题- l
在链接命令的末尾,其中dir_path
-lmysqlclientdir_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.