GCC 编译动态库 so文件时,静态链接libmysqlclient.a 与动态链接参数一起使用问题。

转载自: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依赖文件,就可以使用动态链接。
 

猜你喜欢

转载自blog.csdn.net/ayang1986/article/details/85272235
今日推荐