天天看點

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

背景

今天一早過來,企業微信上就收到一個前端同學發來的問好,順帶給我貼了一個bug,為什麼mit環境登入不上去了?

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

瞬間,我想起來mit環境3台機器為了調試一個功能,都給停掉了,也導緻了上面websocket登入不上(PS:android和ios是通過自己開發的負載均衡服務擷取動态IP位址登入的,是以不受影響。而web是通過nginx+域名的方式,域名映射的3台機器都停了,肯定就登入不上了。)

趕快掏出自己搭建的jenkins利器,一鍵部署N台機器,簡直不要太爽:

CICD實戰——使用Jenkins實作自動化部署和環境隔離

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

PS:jenkins的工作原理大概如上圖,每次建構都先從github/gitlab拉一份代碼,編譯後(自己寫腳本)就可以分發到需要部署的多台機器上部署(自己寫腳本控制)。

1.點選建構

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

2.檢視控制台結果

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

我發現一切都正常,但是程序就是沒起來,怎麼回事?

[[email protected] webapps]# ls
online.base.immsgserver.service  online.base.immsgserver.service.202006026
           

于是,我手動執行了一下:

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

為什麼找不到 libdb-4.7.so?

[[email protected] msg_server]# whereis libdb-4.7.so
libdb-4.7:[[email protected] msg_server]#
[[email protected] msg_server]# whereis libdb-5.3.so
libdb-5.3: /usr/lib64/libdb-5.3.so
           

原因

為了查明原因,我用ldd看了一下依賴:

不能運作的機器:

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

運作良好的機器:

為什麼Linux程式員都喜歡編譯依賴庫的源碼而不是使用成品.so.a庫?背景原因總結

這是為什麼?

最終,花了 1個多小時,我發現在 build.sh 腳本裡面是直接使用之前編譯好的log4cxx.so,而不是每次重新編譯log4cxx。

copy_libs(){
    # lib
    # 解決jekins釋出job編譯過長問題,故提前編譯好protobuf、log4cxx、hiredis等,節約時間
    cp ${CUR_DIR}/lib/linux/* ${CUR_DIR}/lib/
}
           

是以,重新編譯一下log4cxx即可。ldd看一下編譯好的:

[[email protected] linux]# ldd liblog4cxx.so
	linux-vdso.so.1 =>  (0x00007ffd36155000)
	libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0 (0x00007f8597d0b000)
	libldap_r-2.4.so.2 => /usr/lib64/libldap_r-2.4.so.2 (0x00007f8597aab000)
	liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x00007f859789c000)
	libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00007f8597672000)
	libdb-5.3.so => /usr/lib64/libdb-5.3.so (0x00007f85972b2000)
           

總結

是以,為什麼Linux程式員都喜歡編譯依賴庫的源碼呢?我認為其中一個原因就是可以避免因為環境不一緻而帶來一些依賴庫not found的問題。

附錄

1.ldd指令檢視依賴

ldd msg_server
           
linux-vdso.so.1 =>  (0x00007fff3d4fc000)
libslog.so => ./libslog.so (0x00007fad6a9be000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fad6a555000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fad6a339000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fad6a0c7000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fad69dbd000)
libm.so.6 => /lib64/libm.so.6 (0x00007fad69abb000)
           

2.ldd 隻顯示 not found:

輸出

libdb-4.7.so => not found
           

3.objdump 反彙編檢視缺失依賴庫

objdump -x liblog4cxx.so|grep NEEDED
           

輸出

[[email protected] msg_server]# objdump -x liblog4cxx.so|grep NEEDED
  NEEDED               libaprutil-1.so.0
  NEEDED               libldap-2.4.so.2
  NEEDED               liblber-2.4.so.2
  NEEDED               libexpat.so.1
  NEEDED               libdb-4.7.so
  NEEDED               libapr-1.so.0
  NEEDED               libpthread.so.0
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  NEEDED               libgcc_s.so.1
           

繼續閱讀