預處理
完成巨集替換,檔案引入,去除空行和注釋
gcc -e test.c -o test.i
編譯
轉換成彙編**;
gcc -s test.i -o test.s
彙編
轉成目標檔案
gcc -c test.i -o test.o
連線轉成可執行目標檔案
gcc test.o -o test
./test
靜態庫實際上是一些目標檔案的集合(.o),靜態庫是以".a"結尾的。只用於生成可執行檔案階段。
在連線階段,聯結器將從庫中取出所需要的**,複製到可執行檔案中。這種庫成為靜態庫。其特點是可執行檔案中包含了庫**的乙份完整的拷貝,在編譯過程中,就被載入到程式。缺點:重複,且牽一髮而動全身。
#首先生成目標檔案
gcc -c test.c -o test.o
#打包成靜態庫
ar rcs libtest.a test.o
# 檢視靜態庫的內容
ar t libtest.a
執行時,載入的庫
gcc -c test.c -o test.o
gcc -shared -fpic
makefile定義了一些規則,哪些檔案先編譯,哪些檔案重新編譯,如何進行連線
makefile就是「自動化編譯」,告訴make命令如何編譯和連線。
makefile 包含的內容
makfile的規則
a. target 要生成的目標檔案
b. prerequisites 依賴檔案,即生成target所需要的檔案或者其他target
c. command make需要執行的命令
使用方式一:
target: prerequistes ... ; command
使用方式二:
target: prerequistes ...
command
案例假設當前的目錄下存在 main.c tools.c tools.h等三個檔案,下面是makefile的內容:
//.o 檔案會make自動推導出來
main: main.o tools.o
gcc main.o tools.o -o main
.phony:clean //顯示的宣告乙個「偽目標」
clean: //該標籤不會生成『clean』檔案,這樣的target被稱為『偽目標』
-rm main *.o //通過clean 刪除可執行檔案和中間的目標檔案。 // -表示不會終止
make的工作原理1.make會在當前目錄下查詢名為「makefile」或者「makefile」的檔案
2.如果找到,它會把該檔案中的第乙個target,作為最終的target生成。
3.如果main檔案不存在或者main依賴的o檔案比較新,則它會重新生成main檔案。
4.如果main所依賴的o檔案也存在,那麼make會在當前檔案中,查詢該o檔案對應的依賴,若找到,則根據規則生成。
5.make再用.o檔案生成 終極任務的可執行檔案。
makefile中的變數的使用objects = main.o tools.o //宣告變數
main: $(objects) #使用變數
gcc $(objects) -o main
.phony:clean
clean:
-rm main $(objects)
引入其他的makefile
使用include關鍵字可以將其他makefile引入
includebar = z.mk y.mk
include foo.make *.mk $(bar)
-include foo.make *.mk // '-'表示如果檔案找不到,make不會終止,會繼續執行
makefile中的預定義變數
變數名稱
描述預設值
ccc語言編譯器
cccpp
c語言預處理器
$(cc) -e
cxxc++語言編譯器
g++rm
刪除檔案程式的名稱
rm -f
cflags
c語言編譯器編譯選項
無cppflags
c語言預處理器編譯選項
無cxxflags
c++語言編譯器編譯選項
無makefile中的自定變數
自定變數名稱
描述$*
目標檔案的名稱,不包含副檔名
$@目標檔案的名稱,含副檔名
$+所有依賴檔案,以空格隔開,可能包含重複檔案
$^所有依賴檔案,以空格隔開,不包含重複檔案
$<
依賴項中第乙個依賴檔案的名稱
$?依賴項中所有比目標檔案新的檔案
makefile中的函式
無參函式
define func
$(info echo "hello")
endef
$(call func)
--------------
輸出: hello
帶參函式
define func
$(info echo $(1) $(2))
endef
$(call func,hello,world)
--------------
輸出: hello world
make的工作流程
1.讀取所有的makefile檔案
2.讀入被include的makefile檔案
3.初始化檔案中的變數
4.推導隱晦規則,並分析所有規則
5.為所有的目標檔案建立依賴關係鏈
6.根據依賴關係,決定哪些目標需要重新生成
7.執行生成命令
庫(靜態庫和動態庫)
一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...
靜態庫和動態庫
一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...
靜態庫和動態庫
靜態庫 lib 中相當於存放了所有的源 包括他引入的其他靜態lib檔案.其實是所有cpp編譯後對應的.obj檔案的打包 所以靜態lib都比較大。動態庫dll也有lib但是這個lib,只是用來幫助程式在鏈結時定位dll中的函式的位址的。所以會在exe載入時才重定位函式的位址。重定位就是根據鏈結的這個l...