直接放結論, 下面是編譯一個使用了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依賴文件,就可以使用動態鏈接。