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

2021-06-08 22:41:35 字數 1916 閱讀 4269

問題一:undefined reference to '***'.

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

問題三:***.h:no such file or directory.

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

編譯完成之後就進入鏈結階段,這裡就涉及到函式庫,比如通常的用的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 -l***」,也就是鏈結程式ld在那3個目錄裡找不到lib***.so,這時另外乙個引數-l就派上用場了,比如常用的x11的庫,它放在/usr/x11r6/lib目錄下,我們編譯時就要用-l/usr/x11r6/lib -lx11引數,-l引數跟著的是庫檔案所在的目錄名。再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那鏈結引數就是-l/aaa/bbb/ccc -ltest。

-i引數是用來指定頭檔案目錄,/usr/include目錄一般是不用指定的,gcc知道去那裡找,但是如果標頭檔案不在/usr/include裡我們就要用-i引數指定了,比如標頭檔案放在/myinclude目錄裡,那編譯命令列就要加上-i/myinclude引數了,如果不加你會得到乙個"***x.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」查詢,該命令會列出系統支援的所有開發包。

QtCreator新增庫檔案和標頭檔案

在使用qtcreator開發影象處理程式的時候想加入opencv庫來處理圖形,新增標頭檔案,需要編輯工程資料夾下的.pro檔案在檔案中新增以下內容,即可包含標頭檔案的資料夾 includepath d opencv2.0 vc2008 include opencv d opencv2.0 vc200...

鏈結庫和標頭檔案。

1.標頭檔案 系統標準標頭檔案在 usr include 安裝庫的標頭檔案位置 usr local include 如有檔案寫成這樣 include對應 usr include linux can.h 因為他在usr include找不到標頭檔案,是在usr include 下目錄下,所以必須指出他...

C 標準庫名字和標頭檔案

標準庫名字和標頭檔案 name 名字 header 標頭檔案name 名字 header 標頭檔案abort ios base accumulate isalpha allocator islower auto ptr ispunct back inserter isspace bad alloc ...