嵌入式Linux C編程 01

 

  • 預處理(Pre-Processing)
  • 編譯(Compiling)
  • 彙編(Assembling)
  • 連接(Linking)

 

1.3.2 GCC編譯流程分析

gcc [option | filename]bash

一、預處理階段函數

gcc -E -o [目標文件] [編譯文件]工具

gcc -E -o hello.i hello.c優化

二、編譯階段ui

gcc -S -o hello.s hello.ispa

三、彙編階段線程

gcc -c hello.s -o hello.o調試

四、連接階段code

gcc hello.o -o hello遞歸

1.3.3 GCC警告提示

分爲Wall類 和 非Wall類

1.3.4 GCC使用庫函數

靜態庫(.a) 和 動態庫(.so和版本號組成)。庫都存放在/usr/lib 和 /lib 目錄中

例如:libm.so.5 標識符爲m,版本號爲 5,

二、相關路徑選項

1) -I<dir>

改變搜索路徑

gcc hello.c -I/root/workspace/gcc/ -o hello

2) -L<dir>

用於指明庫文件的路徑。

例如:程序hello_sq.c須要用到目錄「/root/workspace/gcc/lib」下的一個動態庫libsunq.so,則

gcc hello_sq.c -L/root/workspace/gcc/lib -lsunq -o hello_sq

「-I<dir>" 和 「-L<dir>」都只是指定了路徑,而沒有指定文件,所以不能再路徑中包含文件名。

 三、使用不一樣類型連接庫

選項「-l」(小寫的L),用於指定具體使用的庫文件。庫都是以「lib」開頭,只需填寫lib以後的內容。

若是libm.a和libm.so同時存在,默認連接共享庫。寫做「-lm」便可

若是選用靜態庫,則在「-l」以前添加選項「-static」。例如,連接libm.a庫文件的選項是「-static -lm」。

1.3.5 GCC代碼優化

編譯選項 -On 控制優化代碼的生成,其中n是一個表明優化級別的整數。比較典型的範圍是從0到2或3。

優化選項-O 主要進行線程跳轉(Thead Jump)和延遲退棧(Deferred Stack Pops)兩種優化。

優化以後,難於調試。

 

1.4 調試器GDB的使用

功能:

  • 可以運行程序,設置全部能影響程序運行的參數
  • 可以讓程序在指定的條件下中止運行
  • 可以在程序中止時檢查全部參數的狀況
  • 可以根據指定條件改變程序的運行

1.4.1 GDB使用實例

#include <stdio.h>

void add(int m)
{
    int i,n = 0;
    
    for (i = 1; i <= m; i++)
    {
        n += i;
    }
    printf("The sum of 1-%d in add is %d\n", m, n);
}

int main()
{
    int i,n = 0;
    
    add(50);
    
    for (i = 1; i <= 50; i++)
    {
        n += 1;
    }
    printf("The sum of 1-50 is %d \n", n);
}

編譯時要加上「-g」選項。

一、進入GDB

#gdb test

二、查看文件

l」(list)查看程序的源碼

三、設置斷點

在 「b」 後加入對應的行號便可

(gdb) b 6

四、查看斷點處狀況

(gdb) info b

五、運行代碼

GDB默認從首行開始運行代碼,鍵入「r」(run)便可

六、查看變量值

p 變量值」

(gdb) p n
$1 = 0
(gdb) p i
$2 = 1345

「$N」標記,當前變量值的引用標記。

七、觀察變量

在某循環處,「watch」來觀察變量的變化狀況

(gdb) watch n

八、單步運行

n」(next)便可

九、程序繼續運行

c」(continue)繼續運行,直到遇到斷點或程序結束

十、退出GDB

q」(quit)便可退出

 

1.4.二、設置/刪除斷點

1.4.三、數據相關命令

1.4.四、調試運行環境相關命令

1.4.五、堆棧相關命令

 

1.5.一、Makefile基本結構

Makefile是make讀入的惟一配置文件。

一般包含以下內容:

  • 須要由make工具建立的目標體(target),目標體一般是目標文件、可執行文件或是一個標籤。
  • 要建立的目標體所依賴的文件(dependency_file)。
  • 建立每一個目標體時須要運行的命令(command)。

格式爲:

target: dependency_files
/t  command
#The simplest example
hello.o: hello.c hello.h
/t gcc -c heelo.c -o hello.o

接着就可使用make了。使用make的格式爲:make target,這樣make就會自動讀入Makefile執行對應target的command語句,並會找到相應的依賴文件。

#make hello.o
gcc -c hello.c -o hello.o
#ls
hello.c hello.h hello.o Makefile

在Makefile中的每個command前必須有「Tab」符。

1.5.二、Makefile變量

定義的名字,用來代替一個文本字符串,該文本字符串稱爲該變量的值。

變量的值能夠用來代替目標體、依賴文件、命令及Makefile文件中的其餘部分。在Makefile中的變量定義有兩種方式:一種是遞歸展開方式,另外一種是簡單方式。

遞歸展開方式定義的變量是在引用該變量時進行替換的,即若是該變量包含了對其餘變量的引用,則在引用該變量時一次性將內嵌的變量所有展開。

簡單擴展型變量的值在定義處展開,且只展開一次,消除了變量的嵌套引用。

遞歸展開方式的定義:VAR=var

簡單擴展方式的定義:VAR:=var

make中變量的使用格式爲:$(VAR)

變量名是大小寫敏感的。推薦使用小寫字母

Makefile中的變量分爲用戶自定義變量預約義變量自動變量環境變量

預約義變量包含了常見編譯器、彙編器的名稱及編譯選項。

CC=gcc
testgdb01.o: testgdb01.c testgdb01.h
	$(CC) -c testgdb01.c -o testgdb01.o
clean: 
	$(RM) testgdb01.o

自動變量一般能夠表明編譯語句中出現的目標文件和依賴文件等,而且具備本地含義。

make在啓動時會自動讀取系統當前已經定義了的環境變量,而且會建立與之具備相同名稱和數值的變量。

1.5.三、Makefile規則

Makefile的規則包括目標體、依賴文件及其間的命令語句,是make進行處理的依據。Makefile中的一條語句就是一個規則。

make還定義了隱式規則和模式規則。

一、隱式規則

隱式規則可以告訴make怎麼使用傳統的技術完成任務。

隱式文件只能查找相同文件名的不一樣擴展名文件。

二、模式規則

隱式規則僅僅可以用make默認的變量來進行操做。

模式規則是用來定義相同處理規則的多個文件的,模式規則能引入用戶自定義變量,爲多個文件創建相同的規則,簡化Makefile的編寫。

模式規則的格式相似於普通規則,這個規則中的相關文件前必須用「%」標明。

1.5.四、make使用

直接運行make,則創建Makefile中的第一個目標。

相關文章
相關標籤/搜索