g++編譯邏輯的簡單理解

1. 文件介紹函數

hello.cpp:   有一個輸出"hello"的函數 void print_hello();spa

hello.h:  對print_hello()函數的聲明;xml

main.c:  調用print_hello函數;get

 

 

2. 編譯過程編譯器

g++ -c hello.cpp  編譯生成hello.o的目標文件編譯

g++ -c main.cpp   編譯生成main.o的目標文件程序

g++ hello.o main.o -o main 把目標文件連接生成main的可執行文件文件

指令須要記一下, -c + 被編譯的文件, -o + 生成的文件名.時間

目標文件和可執行文件均爲同一種文件類型.co

 

 

3. 編譯&連接和.h頭文件有什麼關係?

其實,編譯&連接和頭文件沒有半毛錢的邏輯關係~

惟一的關係就是,誰家cpp文件裏面有include XX.h,就會把這個.h的內容拷貝到本身文件裏面,其餘都是cpp本身的事情

假如main.cpp想使用hello.cpp裏面的函數,能夠本身在main.cpp中寫一個函數聲明,而後就可使用啦.

不想要頭文件徹底能夠不用.

 

話是這麼說,可是main使用的函數比較多,聲明就寫一大堆;

假如別人扔給你一個.o文件,不給看源代碼,你也沒辦法使用別人的函數.

因此.h文件仍是頗有必要的,就像是儲存參數的xml文件.

 

 

4. 認識連接

目標文件生成可執行文件的過程稱爲連接.

我以前認爲,同一個文件夾下的不一樣cpp文件,是好兄弟關係,

別的cpp定義的函數,本身能夠直接拿來用!

——這確定是錯誤的,至少要聲明一下呀!可是這種錯誤的觀點我一直忘不掉,過一段時間就須要糾正一次!

 

因此,兄弟cpp定義的函數,不能直接使用的,由於使用以前須要聲明一下.

——這在VS,Keil等編譯器中確實是這樣。

 

真是狀況是,聲明只是告訴編譯器有這個函數及其調用方式,可是真正運行的時候,到底去哪裏找這個函數呢?

迄今爲止,我並未告訴系統運行程序時去哪裏尋找須要調用的函數,並且在同一個文件夾並不會自動識別其餘cpp定義的函數,

因此,咱們須要手動連接表示他們相互調用的關係:

g++ hello.o main.o -o main 把目標文件連接生成main的可執行文件

 

因此IDE真的是很方便,讓咱們都意識不到存在連接這回事!

 

參考: https://www.jianshu.com/p/e5c6a255076b

相關文章
相關標籤/搜索