1. 程式人生 > 其它 >解決載入libqxcb.so失敗以及Linux庫搜尋順序

解決載入libqxcb.so失敗以及Linux庫搜尋順序

技術標籤:LinuxQT

最近在ubuntu下使用qt編寫程式,遇到QtCreator編譯完程式後執行出現錯誤,無法啟動程式,錯誤資訊如下圖:
在這裡插入圖片描述

經過分析,libqxcb.so依賴庫應該從qt安裝目錄下查詢,錯誤提示資訊中顯示搜尋路徑為系統庫目錄,因此可以肯定是搜尋路徑的問題,因此需要新增環境變數,修改ld.so.config檔案

在這裡插入圖片描述

修改後生效使用命令

sudo ldconfig

專門腦補以下Linux關於動態共享庫搜尋順序的問題,下面內容為網上查閱:

ld.so 動態共享庫搜尋順序

1、ELF可執行檔案中動態段DT_RPATH指定;gcc加入連結引數“-Wl,-rpath”指定動態庫搜尋路徑;

2、環境變數LD_LIBRARY_PATH指定路徑;
3、/etc/ld.so.cache中快取的動態庫路徑。可以通過修改配置檔案/etc/ld.so.conf 增刪路徑(修改後需要執行ldconfig命令);
4、預設的 /lib/;
5、預設的 /usr/lib/

與動態連結庫相關命令

(1)ld 是gcc的連結程式。
(2)ldd是檢視可執行檔案中所依賴的庫的程式,比如想查main程式用到了那些動態庫,可以直接
ldd main
(3)ldconfig用來更新檔案/etc/ld.so.conf的修改生效。
(4)nm用來檢視.so庫中的函式名字,標記是T的就是動態庫裡面生成的名字。如:nm /lib/libc*.so

Linux 下動態連結庫搜尋路徑問題

Linux動態連結庫的搜尋路徑按優先順序排序為:

1.編譯目的碼時指定的動態庫搜尋路徑;

在編譯時通過gcc 的引數”-Wl,-rpath,”指定。當指定多個動態庫搜尋路徑時,路徑之間用冒號”:”分隔。

2.環境變數LD_LIBRARY_PATH指定的動態庫搜尋路徑;

3.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;

/etc/ld.so.conf的第一行有個引用命令:include ld.so.conf.d/*.conf

因此,最優雅的方式是在ld.so.conf.d目錄下建立一個你的程式依賴的配置檔案,配置檔案內容為程式依賴的動態連結庫的路徑,一個路徑一行。

新增完配置檔案後執行ldconfig使其生效。

4.預設的動態庫搜尋路徑/lib;

5.預設的動態庫搜尋路徑/usr/lib;

1、可以用 LD_LIBRARY_PATH 環境變數指定,這個類似於 PATH 機制,比較直觀,而且,可以放到 bashrc 中固化下來,也可以放到自己的 .bashrc 中只對本使用者起作用;

2、如果啟用了 ld.so.cache 的話,系統會在 /etc/ld.so.cache 中儲存所有可引用的動態連結庫。這個檔案的內容可以通過 /etc/ld.so.conf 來指定;這個是比較固定的機制,對全域性所有使用者都有影響;不過更改設定後需要 root 呼叫 ldconfig 來重新整理一下。

3、預設的標準庫路徑,這個似乎不用設定就可以。包括 /lib 和 /usr/lib。當然,如果是64位系統,還包括 /lib64 和 /usr/lib64。

4、其它情況,如果只想對某一個特定的應用程式起作用的話,可以在編譯時指定搜尋路徑。gcc 的 -Wl 和 -rpath 引數。

奇怪的是, /usr/local/lib 和 /usr/local/lib64 居然不在標準路徑之列。