1. 程式人生 > >GCC 編譯動態庫 so檔案時,靜態連結libmysqlclient.a 與動態連結引數一起使用問題。

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依賴檔案,就可以使用動態連結。