Linux下編譯環境及Makefile的學習筆記

2021-07-14 03:22:06 字數 4163 閱讀 8667

linux下編譯環境及makefile的學習筆記

wall類警告包含開啟所有警告的功能並且可以單獨對常見錯誤分別指定警告,這些警告中最為常用的為-wall類警告。它的作用是開啟所有型別的語法警告。

非wall類警告提示最常見的有以下兩種:

-ansi 和 -pedantic

前者強制gcc生成標準語法所要求的告警資訊,並不能保證所有沒有警告的程式都是符合ansic標準的。

後者該選項允許發出ansic標準所列的全部告警資訊。 二、

linux函式庫的介紹

linux中函式庫可以有三種使用的形式:靜態、共享和動態。

靜態庫的**在編譯時就已經鏈結到應用程式中,而共享庫只是在程式開始執行時才載入。

動態庫也是在程式開始執行時才載入,但與共享庫不同的是,動態庫使用的庫函式不是在程式開始執行時開始載入而是在程式中的語句需要使用該函式時才載入。動態庫可以在程式執行期間釋放動態庫所佔的記憶體,供其他程式使用。

由於共享庫和動態庫並沒有在程式中包含庫函式的內容,只包含了對庫的引用,因此**的規模較小。共享庫和動態庫的字尾名由.so和版本號組成,靜態庫的字尾名為.a

三、相關路徑選項

(a)由於庫檔案的通常路徑不是在系統預設的路徑下,因此,首先要使用呼叫路徑選項來制定相關的庫檔案的位置,兩個常用選項的使用方法:

(1)「-i dir」它可以在標頭檔案的搜尋路徑列表中新增dir目錄。

gcc hello.c -i /root/workpace/gcc/ -o hello

(2)「-l dir

」它的功能與-i類似,其區別在於-l選項用於指定庫檔案的路徑。

gcc hello.c -l /root/workpace/gcc/lib -o hello

注意:兩者均指定了路徑,而沒有指定檔案,因此不能再路徑中包含檔名

(b)使用三種型別鏈結庫

使用三種鏈結庫都是用-l選項,由於linux的函式庫的命名規則都是以「lib」開頭的,因此,這裡的庫檔案只需填寫lib之後的內容即可。

例如有靜態庫檔案libm.a和libm.so在呼叫時也只需寫作「-lm」即可。若系統中同時存在檔名相同的靜態庫檔案和動態庫檔案,linux系統預設的呼叫動態鏈結方式,若想呼叫靜態庫檔案需顯示的寫明包含字尾名的檔名。 四、

gdb除錯

進入gdb只需輸入gdb和要除錯的可執行檔案(在編譯時加入-g引數)即可: 1、

檢視檔案

在gdb 中鍵入「l」(list)就可以檢視所在如的檔案。 2、

設定斷點

設定斷點可以使程式到一定的文職暫停他的執行,程式設計師在該位置處可以方便的檢視變數的值、堆疊的情況,在gdb中只需在「b」後加入對應的行號:

(gdb) b  8

注意:在gdb中利用行號設定斷點是指**執行到對應行之前暫停,並沒有執行到指定行。 3、

檢視斷點情況

在設定完斷點後,使用者可以鍵入「info b」來檢視斷點情況,在gdb中可以設定多個斷點。

(gdb) info  b 4、

執行**

gdb預設的是從首行開始執行**,可鍵入「r」即可,在「r」後加上行號即可從程式中指定行開始執行

(gdb)   r 5、

檢視變數的值

在程式停止執行之後,程式設計師需要檢視斷點處的相關變數的值,在gdb中只需鍵入「p+變數值」即可

(gdb)  p  n

gdb 在顯示變數時,會在對應值之前加上「n」

標記,它

是當前變

量值的引

用標記,

所以以後

再次引用

改變量的

時候就可

以直接寫

作「n」標記,它是當前變數值的引用標記,所以以後再次引用改變量的時候就可以直接寫作「

n」而無需寫冗長的變數名。 6、

觀察變數

在某一迴圈處,希望能夠觀察到乙個變數的變化情況,這時就可以鍵入命令「watch」來觀察變數的變化情況。

(gdb) watch  n 7、

單步執行

單步執行是指一次只執行一條語句,這樣可以方便程式設計師檢查程式執行的結果,只需輸入n即可

(gdb) n 8、

程式繼續執行

命令「c」可以使gdb繼續執行一下的程式,程式再次遇到斷點時停止                

(gdb)  c 9、

退出gdb只需「q」即可: 五、

makefile

1.makefile 中的變數

makefile中的變數分為使用者自定義變數,預定義變數,自動變數和環境變數,自定義變數的值有使用者自行設定,而預定義變數和自動變數為通常在makefile中都會出現的變數,其中部分有預設值。預定義變數包含了常見編譯器、彙編器的名稱及其編譯選項。

makefile中常見預定義變數:

cc    c編譯器的名稱預設值為 cc

cxx   c++編譯器的名稱預設值為g++

cflags       c編譯器的選項,無預設值

cppflags     c 預編譯的選項,無預設值

cxxflags     c++ 編譯器的選項,無預設值

為了簡化makefile的編寫,引入了自動變數,自動變數通常可以代表編譯語句中出現的目標檔案和依賴檔案。

$* 不包含副檔名的目標檔名稱

$+ 所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案

$< 第乙個依賴檔案的名稱

$?所有時間戳比目標檔案完的依賴檔案

$@目標檔案的完整名稱

$^ 所有不重複的檔案,以空格分開

$% 如果目標是歸檔成員,則該變數表示目標的歸檔成員名稱

2. makefile 中的規則

在makefile規則中,萬用字元將被自動展開,但在變數的定義和函式的引用時,萬用字元將失效,這種情況下如果要使萬用字元有效就需要使用函式「wildcard」,它的用法是:$(wildcard partters...)。在makefile中,它被展開為已經存在的、使用空格分開的、匹配此模式的所有檔案的列表。

一般情況下:

「$(wildcard *.c

pp)」來獲取工作目錄下的所有的.c

pp檔案列表

;複雜一些用法

:可以使用「$(patsubst %.c

pp,%.o,$(wildcard *.c

pp))」,首先使用「wildcard」函式獲取工作目錄下的.c

pp檔案列表之後將列表中所有檔名的字尾.c

pp替換為.o。這樣我們就可以得到在當前目錄可生成的.o檔案列表。因此在乙個目錄下可以使用如下內容的makefile來將工作目錄下的所有的.c

pp檔案進行編譯並最後連線成為乙個可執行檔案。

#sample makefile

objects := (p

atsu

bst (patsubst

(wildcard 

*.c))

//%和

*都代表萬用字元但是%是

gnumake

語法層的

makefile

中的,而 * 是

shell

命令列下的。

foo : $(objects)

cc -o foo $(objects)

= 是最基本的賦值

:= 是覆蓋之前的值

?= 是如果沒有被賦值過就賦予等號後面的值

+= 是新增等號後面的值

makefile

中變數賦值的「=

」「:=」1、

「=」make會將整個

makefile

展開後,再決定變數的值。也就是說,變數的值將會是整個makefile

中最後被指定的值。看例子:

x = foo

y = $(x) bar

x = xyz

在上例中,y

的值將會是 

xyz bar

,而不是 

foo bar。

2、「:=」

「:=」

表示變數的值決定於它在

makefile

中的位置,而不是整個

makefile

展開後的最終值。

x := foo

y := $(x) bar

x := xyz

在上例中,y

的值將會是 

foo bar

,而不是 

xyz bar

了。

Linux下安裝Redis及make安裝時所踩的坑

正常安裝步驟如下 root localhost yum install gcc root localhost cd usr local root localhost local wget root localhost local tar xvf redis 6.0.1.tar.gz root loc...

linux多核處理下提高編譯速度 make j

linux開源程式編譯往往會需要較長時間,多核處理器的應用可以大大縮短編譯所需要的時間。預設情況下,make並沒有將多核處理器的效能發揮到極限。相反,它只使用了其中乙個核心。make的 j引數可以使make進行並行編譯。make該引數的幫助如下 xhtml view plain copy j n j...

windows系統搭建make編譯環境

1.先安裝git工具,一路next就好,安裝選項說明參考 安裝完成後,右鍵選單新增git gui here git bash here 這裡說明git bash here 開啟後是乙個類似linux下的shell視窗 mingw64 這裡支援shell的一些基本命令 linusz desktop i...