久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

在linux中庫與頭文件的聯系是什么

167次閱讀
沒有評論

共計 2166 個字符,預計需要花費 6 分鐘才能閱讀完成。

本篇內容介紹了“在 linux 中庫與頭文件的聯系是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在 linux 中庫與頭文件的聯系:頭文件中有函數的申明,庫文件實現函數的定義;庫中的每個函數都需要在頭文件中加以聲明。在寫程序時,需要用頭文件來提供對常量的定義和對系統函數及庫函數調用的聲明;而庫是一組已經編譯好的函數的集合,也就是目標文件“.o”的集合,是按照可重用的原則編寫的,一般由一組互關聯的函數組成以執行某項常見任務。

在一般應用程序源代碼中,頭文件中有函數的申明,庫文件實現函數的定義;庫中的每個函數都需要在頭文件中加以聲明。

1. 頭文件

在寫程序時,我們需要用頭文件來提供對常量的定義和對系統函數及庫函數調用的聲明,這些頭文件位于 /usr/include 中。這些頭文件都位于可以被編譯器自動搜索到的目錄中,如 X 視窗系統的 /usr/include/X11 和 GNU C++ 的 /usr/include /c++。

在調用 gcc 時,可以使用標志 - I 來包含保存在子目錄或其它非標準位置中的頭文件,例如 gcc -I/usr/openwin/include fred.c

2. 庫文件

庫是一組已經編譯好的函數的集合,也就是目標文件.o 的集合,是按照可重用的原則編寫的,一般由一組互關聯的函數組成以執行某項常見任務。

標準 linux 系統庫文件一般存儲在 /lib 和 /usr/lib 目錄中。默認情況下 GCC 的鏈接程序只搜索標準 C 語言庫,這是一個歷史遺留問題。我們必須使庫文件名遵守特定的規范并在命令行中加以指定。

庫文件總以 lib 開頭,然后指出這是什么庫,最后的部分.a 代表靜態函數庫,.so 代表共享函數庫(即 windows 下的 DLL 動態鏈接庫)。

如 gcc -o fred fred.c /usr/lib/libm.a 或 gcc -o fred fred.c -lm
- L 標志為鏈接器增加庫的搜索路徑,如 gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11

2.1 靜態庫

靜態庫以.a 結尾,也稱作歸檔文件,在生成可執行程序時,靜態庫文件就被鏈接進去,生成的可執行文件較大,可以脫離靜態庫文件運行。

2.1.1 生成方法

首先創建兩個源文件 fred.c 和 bill.c

然后用 gcc - c 編譯生成兩個目標文件

然后為這兩個函數編寫頭文件,進行函數聲明

然后在 main 函數中包含頭文件并調用其中一個庫函數

然后編譯 main 函數并將 main.o 和之前生成的 bill.o 鏈接,可以正確執行

接下來我們生成庫文件,用 ar 歸檔程序創建歸檔文件并將目標文件添加進去,它可將若干單獨的文件歸并到一個大的文件中。ar crv libfoo.a bill.o fred.o 之后我們要用 ranlib 命令為函數庫生成一個內容表。

然后我們將庫文件和之前生成的 program.o 文件鏈接起來, 執行成功

也可以用 - l 指定函數庫,并用 - L 指定非標準位置。

我們可以用 nm 命令查看哪些函數被包含在目標文件,函數庫或可執行文件中,可用于反匯編分析。程序被創建時它只包含函數庫中它所實際需要的函數,雖然頭文件中有所有函數的聲明,但鏈接器并不會將它們全部鏈接進去。

在 linux 中庫與頭文件的聯系是什么

靜態庫 Linux 與 Windows 的比較

在 linux 中庫與頭文件的聯系是什么

2.2 共享庫

當同時運行許多應用程序并且他們中都使用來自同一個函數庫的函數時,內存中會有同一個函數的許多副本,浪費內存和外存!!當程序使用函數庫時,它本身在鏈接時不再包含函數代碼,而是引用運行時可訪問的共享代碼,當編譯好的程序被裝載到內存中執行時,函數引用被解析并產生對共享庫的調用,如果有必要,共享庫才被加載到內存中。即系統可以只在內存中保留共享庫的一份副本供許多應用程序調用,在外存上也可只保留一份。而且共享庫的更新也可以獨立于依賴它的應用程序,應用程序不需再重新編譯。
在 linux 系統中,負責裝載共享庫并解析客戶程序引用的函數的程序(動態裝載器)是 ld.so

2.2.1 生成方法

用中間文件 bill.o fred.o 生成共享庫 libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.o

在 linux 中庫與頭文件的聯系是什么

生成了共享庫后,要置于標準搜索目錄下。搜索共享庫的額外位置可以在文件 /etc/ld.so.conf 中配置,修改這個文件后執行命令 ldconfig 來處理。
/etc/ld.so.conf 的內容為 include /etc/ld.so.conf.d/*.conf,在此目錄下建立自己的動態鏈接庫路徑配置文件 mylib.conf

在 linux 中庫與頭文件的聯系是什么

然后指定搜索路徑

在 linux 中庫與頭文件的聯系是什么

鏈接生成可執行文件 gcc -o main program.o -lfoo -L.

在 linux 中庫與頭文件的聯系是什么

ldd 工具可用來分析可執行文件運行所需要的共享庫

在 linux 中庫與頭文件的聯系是什么

也可以在編譯目標代碼時指定.so 庫的搜索路徑,通過 gcc 的參數 -Wl,-rpath 指定,如 gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示后面的參數將傳給 link 程序 ld(因為 gcc 會自動調用 ld)當指定多個動態庫搜索路徑時,路徑之間用冒號:分隔。

在 linux 中庫與頭文件的聯系是什么

“在 linux 中庫與頭文件的聯系是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-12發表,共計2166字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 五华县| 昆山市| 连云港市| 阿合奇县| 都兰县| 大石桥市| 治多县| 万源市| 如东县| 兴安盟| 吕梁市| 杭州市| 北宁市| 锡林郭勒盟| 德令哈市| 墨竹工卡县| 皋兰县| 浦北县| 固镇县| 绥滨县| 太白县| 苍梧县| 睢宁县| 年辖:市辖区| 普安县| 余姚市| 齐河县| 九寨沟县| 昌乐县| 边坝县| 东城区| 绥宁县| 通州区| 阿鲁科尔沁旗| 当涂县| 鞍山市| 乌兰浩特市| 天长市| 安庆市| 双江| 西和县|