靜態庫和動態庫

2021-09-26 02:44:41 字數 3065 閱讀 9120

預處理

完成巨集替換,檔案引入,去除空行和注釋

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...