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真的是很方便,讓咱們都意識不到存在連接這回事!