預編譯
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.所有原始檔都放乙個目錄 不建議所有原始檔都放乙個目錄,當工程大時,乙個目錄下會有很...