Search code examples
mysqlclibmysql

Compiling MySQL C API client does not link libmysqlclient.so.20


I'm writing some loadable modules for Zabbix, as such, compiling shared objects. I've written one which uses the MySQL C API to read some data from tables, it's fairly standard, and includes:

#include <my_global.h>
#include <mysql.h>

My gcc command looks like so (expanded mysql_config for clarity):

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

Contents of /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

The .so compiles and runs fine on the dev box, but copying it to a box without mysql-devel installed yields the following error:

cannot load module "zbx_mysql.so": libmysqlclient.so.20: cannot open shared object file: No such file or directory

I can only assume this means that the libmysqlclient.so.20.so isn't being bundled into my .so. I'm pretty much a novice here, so if anyone can advise it'd be greatly appreciated.


Solution

  • Shared libraries aren't "bundled", that's why they're shared. The machine you're trying to run on obviously misses the library. Libraries typically aren't in the "-dev" or "-devel" packages.

    On your typical *nix system, you can have multiple versions of the same shared library installed, but normally only one development package. If you have the dev package for mysql-client 20 installed, the compiled code will link against that version. If you want your compiled code to link against mysql-client 18, install the older version of the development package.

    If you need to be independent of the libraries installed on your target system, one possibility would be to link a static library instead.