转载自:https://blog.csdn.net/toontong/article/details/79077476
直接放结论, 下面是编译一个使用了mysql C API 的 mysql.so 文件(我们的业务中,它是zbx加裁的modules so文件)
gcc -fPIC -shared -o mysql.so mysql.c \
-I/usr/include/mysql \
-L/usr/lib64/mysql \
-Wl,-Bstatic -lmysqlclient \
-Wl,-Wl,-Bdynamic -lssl -lgcc_s -lm -lrt
解释:
-fPIC -shared 参数 一般是一起使用使用,编译so文件用,其不能直接与 -static 参数混用。
-Wl,-Bstatic 使用这个参数,后面接的 -l{库名称} 就是使用静态链接。
-Wl,-Bdynamic 同理,后续的-l 就是动态链接。
排查方法:
先使用全动态编译编译出所需要 的so文件,使用ldd命令查看其依赖了哪些动态库(与路径)。
由于 libmysqlclient_xx.so 中的经常有版本号(5.6=18, 5.7=20)问题,所以使用静态链接能免除此问题。
没版本问题与路径不一致问题的的so依赖文件,就可以使用动态链接。