編譯代碼的時候連結階段出現了問題,/usr/bin/ld: cannot find -lX11,看到這個資訊時心裡很是納悶,在/usr/lib/路徑下明明有libX11.so.6,為什麼沒有連結到呢,再三思索,最後想起-lX11其實代表的是全名是libX11.so,而/usr/lib/下確實沒有這個檔案,如果你不寫-lX11,而是寫/usr/lib/libX11.so.6,那麼連結的時候連結器會準確的找到動態庫。
其實.so結尾的檔案應該是安裝了開發庫的話才會有的,平常我們安裝軟體其實下載的只是標頭檔,只供一般使用,所以出現這個錯誤在我的電腦中是因為沒有安裝開發庫,執行
yum install libX11-devel.i686
安裝完畢後程式連結成功,讓我們再回到/usr/lib庫看看,安裝過後你會發現確實多了.so結尾的動態庫,用ls -l /usr/lib/libX11.so顯示
lrwxrwxrwx 1 root root 15 2月 28 11:08 /usr/lib/libX11.so -> libX11.so.6.3.0
其實它是個符號串連,指向本路徑中的libX11.so.6.3.0。
再看看編譯出的二進位檔案依賴哪些動態庫,執行ldd XXXXX
linux-gate.so.1 => (0xb77d1000)
libX11.so.6 => /lib/libX11.so.6 (0x43dde000)
libncurses.so.5 => ./lib/libncurses.so.5 (0x4702a000)
可執行檔真正載入的是/lib/libX11.so.6,不是/usr/lib/libX11.so.6.3.0,很奇怪,不過讓我們再看看/lib/libX11.so.6到底是什麼,執行
ls -l /lib/libX11.so.6
輸出 lrwxrwxrwx 1 root root 15 2月 28 03:07 /lib/libX11.so.6 -> libX11.so.6.3.0
原來它也是串連檔案,與libX11.so指向不同路徑下的同一個檔案。
所以以後當你遇到這種情況,首先確定自己是否安裝了開發庫,然後看看版本對不對,這裡面的符號串連是不是都是指向同一個動態庫的。如果有問題一定是這3個原因中的一個。
1 系統沒有安裝相對應的lib
2 相對應的lib版本不對
3 lib(.so檔)的symbolic link 不正確,沒有連結到正確的函式庫檔案(.so)