2014-03-28 44 views
0

我在閱讀有關單獨編譯的問題,並對該過程有特別的問題。假設我在一個名爲function.cpp的文件中寫了一個函數。同樣,我在頭文件function.h中正確聲明瞭該函數。現在一個名爲main.cpp的主程序將使用這個函數。首先,產生一個可執行的工作會是足夠運行單獨編譯並再次鏈接

$ g++ -o main main.cpp 

這是否命令還編譯function.cpp文件還是我第一次跑

$ g++ -c function.cpp 
$ g++ -o main main.cpp 

現在假設我做function.cpp中的一些變化。哪個文件需要重新編譯?足以運行

$ g++ -c function.cpp 

感謝您的幫助

回答

3

使用

$ g++ -o main main.cpp 

將導致undefined reference連接錯誤,因爲沒有在function.h定義的符號的定義(如果它們實際上在main.cpp中使用)。

在第二個版本中,您還需要在第二次調用中包含由第一次調用生成的目標文件。

在第三種情況下,它取決於:如果聲明function已更改(例如發生標頭更改),您將需要重新編譯main.cpp。否則,你只需要再次鏈接可執行文件。

gcc可以在源文件上使用-MM-M運行時生成規則。你可以使用它來生成一個原始的Makefile,你真的應該使用一個構建系統。

0

你可以編譯兩個:

g++ -o main function.cpp main.cpp 

我還建議使用-Wall

2

你應該想想這個約兩個獨立的任務:

  1. 編譯。這提供了一個* .o,它包含了所有的函數/類/方法/等。它們是在* .C文件中定義的,並且包含它的* .h(定義,不僅僅是聲明)。對於那些已經聲明但沒有定義的東西,只會有一個參考(「這裏是我不知道的東西」)
  2. 鏈接。這將所有* .o(和* .a和* .so或* dll)放在一起,如果您有庫可以放入混合中),並將嘗試將所有未定義的參考與其他* .o中的定義進行匹配* .o

所以回到你的問題:

$ g++ -c function.cpp 

這次調用G ++編譯,並得到一個function.o

$ g++ -o main main.cpp 

這次調用G ++編譯(main.cpp中)和鏈接(主。o和...您可能需要提供與* .o相關的al,以便它知道在哪裏查找未定義的引用)。

所以,如果你改變function.cpp。您必須至少

  1. 編譯再次獲得function.o
  2. 鏈接的主要程序,以便在function.cpp新的定義得到鏈接在程序的其餘部分未定義的引用。