GCC 編譯動態庫 so文件時,靜態鏈接libmysqlclient.a 與動態鏈接參數一起使用問題。

直接放結論, 下面是編譯一個使用了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依賴文件,就可以使用動態鏈接。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章