我正在为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中。我在这里几乎是一个新手,所以如果有人可以提出建议,我将非常感激。
答案 0 :(得分:1)
共享图书馆没有&#34;捆绑&#34;,这就是他们共享的原因。你试图运行的机器显然错过了库。图书馆通常不在&#34; -dev&#34;或者&#34; -devel&#34;包。
在典型的* nix系统上,您可以安装相同共享库的多个版本,但通常只有一个开发包。如果您安装了mysql-client 20的dev包,则编译的代码将链接到该版本。如果您希望已编译的代码链接到mysql-client 18,请安装旧版本的开发包。
如果您需要独立于目标系统上安装的库,则可能会链接静态库。