在不同平台下编译使用 MySQL C API 的应用程序
最近需要调 MySQL C API 写一些程序,最开始是在 UNIX(macOS) 下开发的,跟着官网的文档做,基本上没出现什么问题,编译非常顺利。
这是 C API 的说明页 -> https://dev.mysql.com/downloads/c-api/
MySQL 对 macOS 平台提供了压缩包,在这里 -> https://dev.mysql.com/downloads/mysql/
我们只需要将里面的 include
和 lib
目录放在一个我们知道的位置(我直接放在了开发目录下),编译的时候链接 mysqlclient
:
gcc source.c -o out -Iinclude -Llib -lmysqlclient
在 Windows 下,MySQL 官方没有提供压缩包(有,但最高到 6.x 版本),而是安装包(msi),他会给你安装完整的 MySQL Server,以及 MySQL Client,还有一大票各种编程语言的 SDK。
你也可以使用 scoop
来仅安装一个 MySQL Client,你只需要 scoop install mysql
即可,在安装到的目录会有 include
和 lib
。
对于官网提供的安装包,装好之后在 C:\Program Files\MySQL\MySQL Server 8.0
下会有 include
和 lib
目录,虽然 installer 写的是 32 bit,但不知道为什么 lib 却是 64 bit 的。
但我尝试用他们去编译,但是怎么也搞不定,链接 mysqlclient 会给我蹦出来一大堆输出,也没什么有效信息,根据官网文档的提示,在 Windows 下可以链接 libmysql,但是会输出一些 undefined reference。
后来发现根本原因是,我的 mingw gcc 跟 mysql lib 的位数不一样。
于是装了一个 mingw64,链接 libmysql
:
gcc source.c -o out -Iinclude -Llib -llibmysql
然后就能跑了。
看似问题很简单,但是中间兜兜转转了两三个小时才定位问题。
最后要注意的是,运行构建出来的二进制时,应该确保运行时动态库 libmysql.dll
在环境变量中,或在二进制文件周围。