编译MySQL C API 客户端不link libmysqlclient.so.20
Compiling MySQL C API client does not link libmysqlclient.so.20
我正在为 Zabbix 编写一些可加载模块,编译共享对象。我写了一个使用 MySQL C API 从表中读取一些数据的,它是相当标准的,包括:
#include <my_global.h>
#include <mysql.h>
我的 gcc 命令看起来像这样(为清楚起见,展开 mysql_config):
gcc -fPIC -shared -o zbx_mysql.so zbx_mysql.c -I/usr/lib64/mysql `mysql_config --cflags` -I/opt/zabbix/3.2/include -L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl
/usr/lib64/mysql 的内容:
-rw-r--r-- 1 root root 21358968 Sep 13 17:15 libmysqlclient.a
lrwxrwxrwx 1 root root 20 Nov 19 23:19 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx 1 root root 24 Nov 19 23:19 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
lrwxrwxrwx 1 root root 20 Nov 19 23:19 libmysqlclient.so -> libmysqlclient.so.20
lrwxrwxrwx 1 root root 24 Nov 19 23:19 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x 1 root root 9580608 Sep 13 17:07 libmysqlclient.so.18.1.0
lrwxrwxrwx 1 root root 24 Nov 19 23:18 libmysqlclient.so.20 -> libmysqlclient.so.20.3.7
-rwxr-xr-x 1 root root 9884704 Sep 13 17:15 libmysqlclient.so.20.3.7
-rw-r--r-- 1 root root 44102 Sep 13 17:13 libmysqlservices.a
drwxr-xr-x 4 root root 28 Nov 19 23:18 mecab
drwxr-xr-x. 3 root root 4096 Nov 19 23:19 plugin
.so 在开发箱上编译和运行良好,但将其复制到没有安装 mysql-devel 的箱子会产生以下错误:
cannot load module "zbx_mysql.so": libmysqlclient.so.20: cannot open shared object file: No such file or directory
我只能假设这意味着 libmysqlclient.so.20.so 没有被捆绑到我的 .so 中。我在这里几乎是一个新手,所以如果有人可以提供建议,将不胜感激。
共享库不是 "bundled",这就是它们被共享的原因。您尝试 运行 的机器显然缺少库。库通常不在“-dev”或“-devel”包中。
在典型的 *nix 系统上,您可以安装同一个共享库的多个版本,但通常只安装 一个 开发包。如果您安装了 mysql-client 20 的开发包,编译后的代码将 link 针对该版本。如果你想让你的编译代码link针对mysql-client 18,安装旧版本的开发包。
如果您需要独立于目标系统上安装的库,一种可能是 link 一个 static 库。
我正在为 Zabbix 编写一些可加载模块,编译共享对象。我写了一个使用 MySQL C API 从表中读取一些数据的,它是相当标准的,包括:
#include <my_global.h>
#include <mysql.h>
我的 gcc 命令看起来像这样(为清楚起见,展开 mysql_config):
gcc -fPIC -shared -o zbx_mysql.so zbx_mysql.c -I/usr/lib64/mysql `mysql_config --cflags` -I/opt/zabbix/3.2/include -L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl
/usr/lib64/mysql 的内容:
-rw-r--r-- 1 root root 21358968 Sep 13 17:15 libmysqlclient.a
lrwxrwxrwx 1 root root 20 Nov 19 23:19 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx 1 root root 24 Nov 19 23:19 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
lrwxrwxrwx 1 root root 20 Nov 19 23:19 libmysqlclient.so -> libmysqlclient.so.20
lrwxrwxrwx 1 root root 24 Nov 19 23:19 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x 1 root root 9580608 Sep 13 17:07 libmysqlclient.so.18.1.0
lrwxrwxrwx 1 root root 24 Nov 19 23:18 libmysqlclient.so.20 -> libmysqlclient.so.20.3.7
-rwxr-xr-x 1 root root 9884704 Sep 13 17:15 libmysqlclient.so.20.3.7
-rw-r--r-- 1 root root 44102 Sep 13 17:13 libmysqlservices.a
drwxr-xr-x 4 root root 28 Nov 19 23:18 mecab
drwxr-xr-x. 3 root root 4096 Nov 19 23:19 plugin
.so 在开发箱上编译和运行良好,但将其复制到没有安装 mysql-devel 的箱子会产生以下错误:
cannot load module "zbx_mysql.so": libmysqlclient.so.20: cannot open shared object file: No such file or directory
我只能假设这意味着 libmysqlclient.so.20.so 没有被捆绑到我的 .so 中。我在这里几乎是一个新手,所以如果有人可以提供建议,将不胜感激。
共享库不是 "bundled",这就是它们被共享的原因。您尝试 运行 的机器显然缺少库。库通常不在“-dev”或“-devel”包中。
在典型的 *nix 系统上,您可以安装同一个共享库的多个版本,但通常只安装 一个 开发包。如果您安装了 mysql-client 20 的开发包,编译后的代码将 link 针对该版本。如果你想让你的编译代码link针对mysql-client 18,安装旧版本的开发包。
如果您需要独立于目标系统上安装的库,一种可能是 link 一个 static 库。