linux c庫檔案和標頭檔相關問題

來源:互聯網
上載者:User
1.從幾個問題談起

問題一:undefined reference to 'xxx'.

問題二:/usr/bin/ld:cannot find -lxxx.

問題三:xxx.h:No such file or directory.

首先,這幾個問題都不是編譯錯誤,是連結錯誤,也就是如果出現的是這幾個錯誤,說明你的來源程式本身沒有問題,是你的編譯選項用的不對或者缺少相關的庫檔案或者標頭檔。前兩個問題是找不到庫檔案的問題,後一個問題是找不到標頭檔的問題。下面詳細說一下標頭檔和庫檔案相關的問題。

2.庫檔案相關(-l選項和-L選項)

編譯完成之後就進入連結階段,這裡就涉及到函數庫,比如通常的用的printf函數,我們僅僅在程式開始包含進了“stdio.h”,這個裡面也只有該函數的聲明,而沒有定義函數的實現,那麼,printf函數的實現在哪裡呢?答案是在函數庫中,連結時,gcc會連結到具體的函數庫中,在那裡可以找到printf函數的實現。

-l參數就是用來指定程式要連結的庫,-l參數緊接著就是庫名,那麼庫名跟真正的庫檔案名稱有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔案名稱是libm.so,很容易看出,把庫檔案名稱的頭lib和尾.so去掉就是庫名了。

好了現在我們知道怎麼得到庫名了,比如我們自已要用到一個第三方提供的庫名字叫libtest.so,那麼我們只要把libtest.so拷貝到/usr/lib裡,編譯時間加上-ltest參數,我們就能用上libtest.so庫了(當然要用libtest.so庫裡的函數,我們還需要與libtest.so配套的標頭檔)。

放在/lib和/usr/lib和/usr/local/lib裡的庫可直接用-l參數就能連結了,但如果庫檔案沒放在這三個目錄裡,而是放在其他目錄裡,這時我們只用-l參數的話,連結還是會出錯,出錯資訊大概是:“/usr/bin/ld:cannot find -lxxx”,也就是連結程式ld在那3個目錄裡找不到libxxx.so,這時另外一個參數-L就派上用場了,比如常用的X11的庫,它放在/usr/X11R6/lib目錄下,我們編譯時間就要用-L/usr/X11R6/lib
-lX11參數,-L參數跟著的是庫檔案所在的目錄名。再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那連結參數就是-L/aaa/bbb/ccc -ltest。

3.標頭檔相關(-I選項)

-I參數是用來指定標頭檔目錄,/usr/include目錄一般是不用指定的,gcc知道去那裡找,但是如果標頭檔不在/usr/include裡我們就要用-I參數指定了,比如標頭檔放在/myinclude目錄裡,那編譯命令列就要加上-I/myinclude參數了,如果不加你會得到一個"xxxx.h: No such file or directory"的錯誤。-I參數可以用相對路徑,比如標頭檔在目前的目錄,可以用-I.來指定。

 

手動來寫這些編譯選項參數一般比較麻煩,而且容易出錯,比如,我程式中用到了glib庫中的函數,由於glib庫一般不是系統內建的庫,我是手動編譯源碼安裝的,預設安裝路徑是/usr/local/lib,標頭檔在/usr/local/include/glib-2.0下面。我編譯我自己的代碼時,如果直接編譯,不加任何編譯選項,會提示"glib.h: No such file or directory"錯誤,這裡有兩個解決方案。

方法一:第一安裝的時候手動指定安裝路徑,安裝到/usr下面,預設安裝是直接”./configure”,  “make”和”make install”三條命令,如果要手動指定安裝路徑就用”./configure --prefix=/usr”,”make”和”make install”.

方法二:編譯的時候添加編譯選項。我這裡沒有直接用-l和-I選項,我利用了一個工具pkg-config。具體的編譯命令是:“gcc`pkg-config --cflags --libs glib-2.0 ` test.c”。

 pkg-config會自動的產生指定庫的庫檔案和標頭檔路徑,pkg-config的用法就是“ pkg-config --cflags --libs pkgName”, 其中pagName是包名,如果不知道具體的包名是什麼,可以通過命令“pkg-config --list-all”查詢,該命令會列出系統支援的所有開發包。

(新浪微博:@全亮_機器學習)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.