編譯過程和makefile

2021-08-16 13:40:33 字數 1290 閱讀 6097

預編譯

g++ -e test.c -o test.i

則做了以下處理:

刪除所有#define,並展開所有巨集定義

處理所有條件預編譯指令,如#ifdef等

處理#include 預編譯指令, 把#include 標頭檔案中的函式都宣告都扔進來

去掉所有的注釋

新增行號,編譯gdb除錯

保留¥pragma

編譯:  g++ -s test.i -o test.s

編譯過程:

詞法分析:

經過掃瞄,把**句轉為一堆記號。

語法分析:

生成語法樹。

語義分析:

給語法樹標識上型別。

中間語言生成:

進行一系列優化,例如(2+7)可以被優化掉

目標**的生成和優化:

生成了彙編**

各目標檔案和靜態庫進行了連線。

makefile的編寫

test程式需要2個鏈結檔案合成,依賴這2個鏈結檔案

:test: file1.o file2.o

g++ file1.o file2.o -o  helloword

而file1.o則由file1.cpp生成

file1.o: file1.cpp

g++ -c file1.cpp -o file1.o

而file2.o則由file2.cpp和file2.h生成

file2.o: file2.cpp file2.h

g++ -c file1.cpp -o file2.o

執行make clean時,則執行

clean:

rm -rf *.o test

可使用變數,有點像巨集定義

即可讓xx = g++

cc = gcc

$(xx) 或者$(cc) 就可以拿來用了

cflags = -wall -o -g

wall指輸出警告資訊

-o(大o) 在編譯時進行優化

-g 指可以作debug

那麼cflags每次就可以加在生成file.o那裡

objs = file1.o file2.o

則指代連線要用的那些檔案

函式:可用wildcard  加 patsubst得出所需要的.o檔案

%.o: %.c

$(cc) $(cflags) -c $< -o $@

則把所有的.c檔案編譯成.o檔案

$《指   依靠列表中的第乙個檔案

$@指  目的檔名,一般就是那些.o檔案

$^指 整個依靠的列表

gcc編譯過程 Makefile反思

看了一段時間的 程式設計師自我修養 了,也算對程式的編譯,鏈結,裝載的原理有了初步的了解。十分慚愧的是,今天想自己寫乙個簡單的makefile,竟然很模糊,無法十分自如的寫出 平時都用乙個已經寫好的樣板改 這裡做乙個反思。假設有a.c檔案,要把它編譯成可執行檔案a。編譯 彙編 試了一下,以下三種寫法...

編譯模組 Makefile

在makefile中我們經常看到 這幾個賦值運算子,那麼他們有什麼區別呢?我們來做個簡單的實驗 新建乙個makefile,內容為 ifdef define vre vre hello world else endif ifeq opt define vre hello world first end...

Makefile工程編譯

1.寫在前面 本篇文章講的是接前面makefile之編譯多個可執行程式中第二個需求,並延伸到對正規工程的編譯。2.工程 我接觸的工程有2種情況 所有原始檔都放乙個目錄 按模組分放不同的目錄 下面按照這兩種情況講解。3.所有原始檔都放乙個目錄 不建議所有原始檔都放乙個目錄,當工程大時,乙個目錄下會有很...