預編譯,編譯,鏈結的原理

2021-04-02 13:23:05 字數 1310 閱讀 2097

假設我們有下面這樣的乙個程式,源**如下:

/* main.c */

#include "mytool1.h"

#include "mytool2.h"

int main(int argc,char **argv)

/* mytool1.h */

#ifndef _mytool_1_h

#define _mytool_1_h

void mytool1_print(char *print_str);

#endif

/* mytool1.c */

#include "mytool1.h"

void mytool1_print(char *print_str)

/* mytool2.h */

#ifndef _mytool_2_h

#define _mytool_2_h

void mytool2_print(char *print_str);

#endif

/* mytool2.c */

#include "mytool2.h"

void mytool2_print(char *print_str)

當然由於這個程式是很短的我們可以這樣來編譯

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

gcc -o main main.o mytool1.o mytool2.o

# 這是上面那個程式的makefile檔案

main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

我的問題是:由makefile檔案可以看出,main.o檔案是和main.c, mytool1.h, mytool2.h相依賴的。為什麼在

gcc -c main.c

編譯main.o時候,沒有涉及兩個.h檔案呢?

答案是:main.c檔案中的#include預處理器命令,告訴預處理器開啟指定的標頭檔案,並在#include語句所在的地方插入標頭檔案。所以,在實際編譯這個步驟上,

gcc -c main.c,由於經歷了預編譯,main.c中已經包含了兩個.h檔案。

編譯原理 預編譯 編譯 彙編與鏈結

我們編寫的程式 是怎樣執行起來的?到底執行的是什麼內容?平時我們所說的編譯主要包括預編譯 編譯 彙編與鏈結,這四部分分別都幹什麼工作,主要職能有哪些。講述編譯之前,我們先要了解程式記憶體。乙個由c c 編譯的程式占用的記憶體,大致分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式...

預編譯,編譯,彙編,鏈結

2.編譯的工作內容 3.彙編的工作內容 4.鏈結器的工作內容 參考 include int main 使用gcc編譯器 gcc hello.c a.out a.out 含義是 assembler output 即 彙編輸出 上述過程可以分解為四個步驟 1.預處理 prepressing gcc e ...

C 預編譯 編譯 彙編 鏈結

windows中以2 2劃分核心 使用者空間,linux中以1 3劃分核心 使用者空間。在text段中,只有普通區域性變數是指令 int gdata1 10 data 已初始化且初始化不為零的資料 int gdata2 0 bss 未初始化或初始化為零的資料 int gdata3 bss stati...