/usr/bin/ld: cannot find -lX11解決方法

編譯代碼的時候鏈接階段出現了問題,/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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章