




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2022-4-28Page 1 Linux和C語言有很深的淵源,因為Linux本身就是用C語言編寫的。 在Linux操作系統中也提供了C語言的開發環境。這些開發環境一般包括: 程序生成工具; 程序調試工具; 工程管理工具。 本章介紹Linux環境下C語言開發的相關知識。 2022-4-28Page 2 C C語言簡單回顧語言簡單回顧2.1LinuxLinux程序設計基礎知識程序設計基礎知識 2.2LinuxLinux下的下的C C語言開發環境語言開發環境*2.3嵌入式嵌入式LinuxCLinuxC語言開發流程和開發工程語言開發流程和開發工程*2.42022-4-28Page 3 C語言最早是由
2、貝爾實驗室的Dennis Ritchie為了UINX的輔助開發而編寫的,它是在B語言的基礎上開發出來的。盡管C語言不是專門針對UNIX操作系統或機器編寫的,但是它與UNIX的關系十分緊密。2022-4-28Page 4 嵌入式嵌入式LinuxLinux中程序的運行原理中程序的運行原理2.5LinuxLinux程序設計的特點程序設計的特點2.6LinuxLinux下的下的C C語言編碼的風格語言編碼的風格2.7本章小結本章小結2.8 思考與練習思考與練習2.92022-4-28Page 5 1987年,隨著微型計算機的日益普及, 出現了許多C語言版本。由于沒有統一的標準,使得這些C語言之間出現了
3、一些不一致的地方。為了改變這種情況,美國國家標準研究所(ANSI)為C語言制定了一套ANSI標準,成為現行的標準C語言的主要特點 。 2022-4-28Page 61990年,國際化標準組織ISO(Intrernational Standard Organization)接受了87 ANSI C為ISO C 的標準(ISO9899-1990)。1994年,ISO修訂了C語言的標準。目前流行的C語言編譯系統大多是以ANSI C 為基礎進行開發的,但不同版本的C編譯系統說實現的語言功能和語法規則有略有差別。2022-4-28Page 7C語言具有繪圖能力強,可移植性,并具備很強的數據處理能力,因此
4、適于編寫系統軟件,三維,二維圖形和動畫,它是數值計算的高級語言。由于它的硬件無關性和可移植性,使得C語言逐漸成為世界上使用最廣泛的語言。2022-4-28Page 8C語言的特點如下:1. 簡潔緊湊、靈活方便2. 運算符豐富3. 數據結構豐富4. C是結構式語言5. C語法限制不太嚴格、程序設計自由度大2022-4-28Page 9 6.允許直接訪問物理地址,直接操作允許直接訪問物理地址,直接操作硬件硬件7. 程序執行效率高程序執行效率高8. 可移植性好可移植性好 2022-4-28Page 10C語言有一個突出的優點就是適合于多種操作系統,如DOS、UNIX,也適用于多種機型。 C語言也有自
5、身的不足,比如:C語言的語法限制不太嚴格,對變量的類型約束不嚴格,影響程序的安全性,對數組下標越界不作檢查等。從應用的角度,C語言比其他高級語言較難掌握。2022-4-28Page 112.2.1程序安裝目錄 1、Linux下程序通常保存在專門的目錄里系統軟件可以在/usr/bin子目錄里找到;系統管理員為某個特定的主機系統或本地網絡添加的應用程序可以在/usr/local/bin子目錄里找到。 2022-4-28Page 122、Linux系統中典型的應用程序由以下幾部分組成:普通執行程序文件(/usr/bin) 服務器執行程序文件和管理程序文件(/usr/sbin) 應用程序配置文件(/e
6、tc) 應用程序文檔手冊文件(/usr/share/doc/) 應用程序手冊頁文件(/usr/share/man/) 2022-4-28Page 133、系統管理員一般使用/usr/local子目錄,該目錄可以把供應商提供的文件和后來添加的程序以及系統本身提供的程序隔離開。2022-4-28Page 142.2.2頭文件 glibc_header是Linux下的系統頭文件,如果缺少系統頭文件,很多用到系統功能的C程序將無法編譯。1、在使用C語言和其他語言進行程序設計時,需要頭文件來提供對常數的定義和對系統函數及庫函數的調用的聲明聲明。2022-4-28Page 152、對C語言來說,頭文件的保
7、存位置:/usr/include:系統頭文件/usr/local/include:本地頭文件2022-4-28Page 163、在調用C語言編譯器時,可以通過-I編譯命令標志來引用保存在下級子目錄或者非標準位置的頭文件。 例如:/root/test/include/include-test.h /root/test/include/include-test.c 當前路徑/root/test,源文件中使用#include ,則編譯命令gcc如何寫? 解答:gcc I /root/test/include -c include-test.c 或 gcc I include -c include-t
8、est.c問題:如果源文件中使用#include “include/include-test.h” 或#include “/root/test/include/include-test.h”,則編譯命令gcc如何寫?2022-4-28Page 17inux常用頭文件如下所示:2022-4-28Page 182.2.3庫文件 庫文件庫文件是一些預先編譯好的函數的集合,這些函數都是按照可再使用的原則編寫的。這些函數通常由一組相互關聯的用來完成某項常見工作的函數構成。 庫文件與頭文件關系:1、頭文件中有函數的申明,庫文件實現函數的定義,庫文件一般是以二進制形式而不是C源文件形式 。2、庫文件通過頭文
9、件向外導出接口。用戶通過頭文件找到庫文件中函數實現的代碼從而把這段代碼鏈接到用戶程序中去。 2022-4-28Page 191 1、庫文件必須遵守一定的命名規、庫文件必須遵守一定的命名規則則 lib開頭+庫名稱+擴展名注意:庫文件的名字總是以lib開頭,隨后的部分指明這是什么庫 比如:libm就代表了數學庫文件名的擴展名部分以“.”開始,可以是“.a”或“.so”2022-4-28Page 202 2、庫文件的類型有以下形式、庫文件的類型有以下形式.a(Archive)靜態函數庫 應用程序編譯時從靜態庫中直接拷貝函數到二進制映像文件,編譯后的可執行程序較大,但執行較快,體現為“空間換時間”.s
10、o(ShareObject)共享函數庫(動態庫) 可執行文件在運行時將函數代碼從共享庫文件中讀出,既動態鏈接,從而間接引用。編譯后的可執行程序較小,但執行較慢,體現為“時間換空間”2022-4-28Page 213 3、庫函數的基本路徑、庫函數的基本路徑編譯時要告訴編譯時要告訴C C語言編譯器(鏈接程序)語言編譯器(鏈接程序)應該去查找哪些庫文件。默認情況下,它只會查找應該去查找哪些庫文件。默認情況下,它只會查找C C語言的標準庫文件。語言的標準庫文件。 /lib:系統必備共享庫。/usr/lib:標準共享庫和靜態庫。/usr/local/lib:本地函數庫。/usr/i486-Linux-l
11、ibc5/lib:libc5兼容性函數庫。/usr/XIIR6/lib:XIIR6函數庫。2022-4-28Page 224 4、庫文件的搜索順序如下:、庫文件的搜索順序如下:(1)首先在“LD_LIBRARY_PATH”環境變量所設置的路徑下查找;(2)搜索動態加載器在/etc目錄下的緩存文件/etc/ld.so.cache。2022-4-28Page 235 5、例題:創建靜態庫和動態庫、例題:創建靜態庫和動態庫 創建靜態庫步驟:創建靜態庫步驟:(1)編寫庫的頭文件及庫的實現文件編寫庫的頭文件及庫的實現文件(2)編譯生成各目標文件)編譯生成各目標文件(3)用)用ar文件對目標文件歸檔,生成
12、靜態庫文件。文件對目標文件歸檔,生成靜態庫文件。(4)使用生成的靜態庫)使用生成的靜態庫2022-4-28Page 24(1)編寫庫的頭文件)編寫庫的頭文件myalib.h及庫的實現及庫的實現文件文件myalib.c/myalib.h #inlcude void test() printf(test resultn); void test(); /myalib.c 2022-4-28Page 255 5、例題:創建靜態庫和動態庫、例題:創建靜態庫和動態庫 創建靜態庫步驟:創建靜態庫步驟:(1)編寫庫的頭文件及庫的實現文件)編寫庫的頭文件及庫的實現文件(2)編譯生成各目標文件編譯生成各目標文件(
13、3)用)用ar文件對目標文件歸檔,生成靜態庫文件。文件對目標文件歸檔,生成靜態庫文件。(4)使用生成的靜態庫)使用生成的靜態庫2022-4-28Page 26(2)編譯生成各目標文件)編譯生成各目標文件 gcc -c myalib.cmyalib.h myalib.c myalib.o執行完后會生成執行完后會生成一個目標文件一個目標文件myalib.o2022-4-28Page 275 5、例題:創建靜態庫和動態庫、例題:創建靜態庫和動態庫 創建靜態庫步驟:創建靜態庫步驟:(1)編寫庫的頭文件及庫的實現文件)編寫庫的頭文件及庫的實現文件(2)編譯生成各目標文件)編譯生成各目標文件(3)用用ar
14、文件對目標文件歸檔,生成靜態庫文件。文件對目標文件歸檔,生成靜態庫文件。(4)使用生成的靜態庫)使用生成的靜態庫2022-4-28Page 28(3)用)用ar文件對目標文件歸檔,生成靜態庫文件文件對目標文件歸檔,生成靜態庫文件 ar -rcs libtest.a myalib.o注意:r表明將模塊加入到靜態庫中;c表示創建靜態庫;s表示生成索引。 庫文件名一定要以lib打頭,.a結尾myalib.h myalib.c myalib.o libtest.a執行完后會生成一個靜態執行完后會生成一個靜態庫文件庫文件libtest.a2022-4-28Page 295 5、例題:創建靜態庫和動態庫、
15、例題:創建靜態庫和動態庫 創建靜態庫步驟:創建靜態庫步驟:(1)編寫庫的頭文件及庫的實現文件)編寫庫的頭文件及庫的實現文件(2)編譯生成各目標文件)編譯生成各目標文件(3)用)用ar文件對目標文件歸檔,生成靜態庫文件。文件對目標文件歸檔,生成靜態庫文件。(4)使用生成的靜態庫使用生成的靜態庫2022-4-28Page 30(4)使用生成的靜態庫使用生成的靜態庫gccgcc -I ./ -c -I ./ -c main.cmain.c#Include Int main(int argc,char* argv) test(); return 0; 編寫測試程序編寫測試程序main.cmyalib.
16、h myalib.c myalib.o libtest.a main.c main.otest result編譯編譯main.cgccgcco main o main main.omain.o -L ./ -l test -L ./ -l test myalib.h myalib.c myalib.o libtest.a main.c main.o main生成可執行文件執行./main2022-4-28Page 31(4)使用生成的靜態庫使用生成的靜態庫注意:1、在在gcc的參數說:的參數說: -I -I參數后加上靜態庫頭文件的路徑。參數后加上靜態庫頭文件的路徑。 -L -L參數后加上庫文件
17、所在目錄參數后加上庫文件所在目錄 -l -l參數后加上庫文件名,但是要去掉參數后加上庫文件名,但是要去掉liblib和和.a.a擴展名。擴展名。 比如庫文件名是比如庫文件名是libtest.alibtest.a那么參數就是那么參數就是- -ltestltest2 2、 -l參數好象應該加到輸入文件名的后面,否則會報錯。2022-4-28Page 325 5、例題:創建靜態庫和動態庫、例題:創建靜態庫和動態庫 創建動態庫步驟:創建動態庫步驟:(1)編寫庫的頭文件及庫的實現文件)編寫庫的頭文件及庫的實現文件(2)用用gcc編譯生成動態態庫文件編譯生成動態態庫文件(3)使用生成的動態庫)使用生成的動
18、態庫2022-4-28Page 33(2)用用gcc編譯生成動態態庫文件編譯生成動態態庫文件gcc -shared -fPIC myalib.c -o libtest.somyalib.h myalib.c myalib.o libtest.so執行完后會生成一個動態執行完后會生成一個動態庫文件庫文件libtest.so注意:動態庫文件名一定要以lib打頭,.so結尾2022-4-28Page 345 5、例題:創建靜態庫和動態庫、例題:創建靜態庫和動態庫 創建動態庫步驟:創建動態庫步驟:(1)編寫庫的頭文件及庫的實現文件)編寫庫的頭文件及庫的實現文件(2)用)用gcc編譯生成動態態庫文件編譯
19、生成動態態庫文件(3)使用生成的動態庫使用生成的動態庫2022-4-28Page 35(3)使用生成的動態庫使用生成的動態庫gccgcc -I ./ -c -I ./ -c main.cmain.c#Include Int main(int argc,char* argv) test(); return0; 編寫測試程序編寫測試程序main.cexport LD_LIBRARY_PATH=./gccgcco main o main main.omain.o -L ./ -l test -L ./ -l test 執行./maintest result指定加載庫的路徑編譯編譯main.cmyal
20、ib.h myalib.c myalib.o libtest.a main.c main.o生成可執行文件myalib.h myalib.c myalib.o libtest.so main.c main.o main2022-4-28Page 36(3)使用生成的動態庫使用生成的動態庫注意:如果不指定LD_LIBRARY_PATH,程序執行將出錯2022-4-28Page 375 5、GUUGUU的的C C函數庫函數庫glibcglibc (1 1)glibcglibc是是LinuxLinux上最重要的函數庫上最重要的函數庫glibcglibc是是gnugnu發布的發布的libclibc庫,
21、即庫,即c c運行庫。運行庫。glibcglibc是是linuxlinux系統中最底層的系統中最底層的apiapi,幾乎其它任何運行庫都會依賴于幾乎其它任何運行庫都會依賴于glibcglibc。 2022-4-28Page 38(2)glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現,主要的如下:string:字符串處理signa:信號處理dlfcn:管理共享庫的動態加載direct:文件目錄操作elf:共享庫的動態加載器,即interpreter2022-4-28Page 39iconv:不同字符集的編碼轉換inet:socket接口的實現i
22、ntl:國際化,即gettext的實現io:基本IO操作linuxthreads:線程locale:本地化login:虛擬終端設備的管理,及系統的安全訪問malloc:動態內存的分配與管理stdlib:其它基本功能2022-4-28Page 40LinuxLinux中提供了中提供了C C語言的開發環境。語言的開發環境。這些開發環境主要包括:這些開發環境主要包括:程序生成工具;程序生成工具;程序調試工具;程序調試工具;工程管理工具。工程管理工具。2022-4-28Page 411程序生成工具GCC(GNU Compiler Collection)GCC提供了C語言的編譯器、匯編器、連接器以及一系
23、列輔助工具。GCC可以用于生成Linux中的應用程序,也可以用于編譯Linux內核和內核模塊,是Linux中C語言開發的核心工具。2022-4-28Page 422程序調試工具GDBGDB是Linux中一個強大的命令行調試工具,使用GDB調試C語言的時候,可以使用設置斷點、單步運行、查看變量等功能。2022-4-28Page 433工程管理工具make和Makefile在工程管理方面,有效地使用make和Makefile可以統籌工程中的各個文件,并在編譯過程中根據時間戳,有選擇地進行編譯,減少程序生成時間。2022-4-28Page 442022-4-28Page 452.4.1 編譯編譯是指
24、把用高級語言編寫的程序轉換成相應處理器的匯編語言程序的過程。 從本質上講,編譯是一個文本轉換的過程。編譯過程包含了C語言的語法解析和匯編語言的生成兩個步驟。編譯一般是逐個文件進行。源程序(文本)匯編程序2022-4-28Page 462.4.2 匯編匯編是從匯編語言程序生成目標系統的二進制代碼(機器代碼)的過程。匯編代碼 二進制代碼(目標文件)2022-4-28Page 472.4.3 連接連接過程是指將匯編生成的多段機器代碼組合成一個可執行程序。 一般來說,通過編譯和匯編過程,每一個源文件將生成一個目標文件。連接器的作用就是將這些目標文件組合起來,組合的過程包括了代碼段、數據段等部分的合并,
25、以及添加相應的文件頭。多個目標文件一個可執行程序注意:頭文件的添加時機為連接時才添加,考慮原因?2022-4-28Page 482.5.1 在Linux的開發環境中,C語言程序的運行環境 作為UNIX操作系統的一種,Linux的操作系統提供了一系列的接口,這些接口被稱為系統調用(System Call)。 C語言的庫函數通過調用系統調用來實現,庫函數對上層提供了C語言庫文件的接口。 在應用程序層,通過調用C語言庫函數和系統調用來實現功能。(一般來說,應用程序大多使用C語言庫函數實現其功能,較少使用系統調用。)2022-4-28Page 49 2.5.2 可執行程序的構成C語言程序經過編譯-匯編-連接,最終生成可執行程序格式。可執行程序中包含兩個部分的內容:程序頭程序主體(二進制機器代碼)在程序頭中包含了供操作系統加載的信息,操作系統根據這些信息加載可執行程序。 可執行程序的主體依然是二進制的機器代碼。程序在運行的時候,正是靠逐條地執行這些機器代碼,形成程序運行的序列。2022-4-28Page 50 2.5.3 ELF 1、 ELF(excutable and linking format)是一種可執行可鏈接格式的二進制文件“可執行”指可以被調入內存供CPU直接運行;“可鏈接”指多個ELF格式的目標文件可以被鏈接在一起形成一個可執行文件。 2022-4-28Page 51
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025下半年機械行業設備更新科技賦能智能無人裝備崛起
- 歷史期末專題復習知識點整L2024~2025學年統編版七年級歷史下冊
- 金融科技企業估值與投資策略在2025年金融科技機器人技術應用報告
- 低碳城市建設的規劃與實踐:山東案例分析報告2025
- 2025年工業機器人在柔性制造系統中的應用與機器人視覺技術結合報告
- 民辦教育機構2025年合規運營與品牌建設創新路徑探索報告
- 2025年零售行業私域流量運營的顧客體驗提升計劃報告
- 新零售環境下便利店智能化庫存管理與物流優化報告
- 新能源微電網穩定性控制與優化運行在智能家居中的應用報告
- 海洋生態修復項目可行性分析與2025年政策支持報告
- 2025春季學期國家安全教育期末考試-國開(XJ)-參考資料
- 2025年安全生產月主題培訓課件:如何查找身邊安全隱患
- JBT 1306-2024 電動單梁起重機(正式版)
- TCALC 003-2023 手術室患者人文關懷管理規范
- 美的集團財務報告
- 測控電路課程設計報告--信號采集調理電路的設計
- 法律英語單詞分單元匯總
- 江蘇省高中學生學籍卡
- 碳排放問題的研究--數學建模論文
- 贏越酒會講解示范
- 香港匯豐銀行開戶-董事實益擁有人聲明(樣本)
評論
0/150
提交評論