2015-03-02 55 views
0

我是C++的新手,很難理解獲得創建和編譯的類對象文件的步驟。C++什麼時候編譯類對象文件?

比方說,我創建3個文件:1.類的頭文件2.類CPP文件(成員函數定義本)3.主要CPP文件

/* 當運行主CPP文件,其中包含的類頭文件(比如說「#include class.h」),類cpp文件何時被編譯,目標文件是否已創建並鏈接?

我有困難的原因是,從編譯器的角度來看,當它看到主cpp文件時,只有頭定義,沒有成員函數定義。但是,即使在類頭文件中,也沒有包含類cpp文件。如果編譯器在類頭文件和主cpp文件中沒有引用時,它如何知道運行類cpp文件? */

讓我澄清我的問題。 //也許我說了一些我甚至不理解的東西哈哈。

所以,基本上我試圖在說'main.cpp'文件中運行主函數。這個'main.cpp'文件包含'class.h'頭文件(包括「class.h」)。當'class.h'中沒有聲明成員函數時,編譯器如何執行頭文件中定義的函數?我所有的成員函數聲明都在'class.cpp'中,它不包含在'class.h'或'main.cpp'中。

+0

在C++中沒有像「類對象文件」AFAIK這樣的東西,至少不是特別的。另外,你不「運行cpp文件」。爲了理解你的問題,你如何用兩個「cpp」文件編譯一個項目?因爲它們都是相同的,所以如果有類,並不重要,你可以有一個只有一個函數定義的'cpp'。 – luk32 2015-03-02 08:56:39

+0

@ luk32例如:Rectangle.h包含在Rectangle.cpp中,編譯Rectangle.cpp並創建Rectangle.obj。我認爲這是OP所指的「類對象文件」。 – 2015-03-02 09:00:17

+0

@GrinNare更新(編輯)你的問題添加該評論,並刪除該評論。 – 2015-03-02 09:03:58

回答

1

我懷疑你正在使用IDE,因爲你提到了運行cpp文件 - 編譯器不知道如何運行任何東西。

您的IDE爲您管理這些依賴關係。
當您按下「運行」時,IDE將決定項目中的哪些文件需要編譯,編譯完成後會將所有目標文件鏈接在一起。
如果編譯和鏈接成功,IDE將啓動可執行程序。

如果您想更好地理解這些概念,請離開您的IDE並在命令行上執行所有的編譯和鏈接。
(這並不複雜,只是單調乏味。)

+0

感謝您的回答。正如我所說我是C++的新手,很多東西都是新的。 我想你提到的IDE是我正在使用的'Xcode'。 所以這個程序會將文件傳遞給編譯器,鏈接目標文件,併爲我啓動可執行程序,對嗎? – GrinNare 2015-03-02 09:08:23

+0

@GrinNare準確。 – molbdnilo 2015-03-02 09:29:48

1

您需要編譯每個.cpp文件。頭; .h文件僅用於聲明,意味着讓編譯器確定您是否正確使用函數。每個.cpp包含代碼,並且應該被翻譯成機器代碼(.o文件)。完成所有這些編譯後,您需要鏈接它們以構建可執行文件,以便使用的每個函數都包含在同一個文件中。下面的命令可以幫助你(使用g++編譯):

$ g++ -c myclass.cpp   // produces the myclass.o file 
$ g++ -c main.cpp    // produces the main.o file 
$ g++ -o myapp main.o myclass.o // produces the myapp executable 

這過於簡單了便於理解。

+0

感謝您的回答。現在我明白了這個過程。但是,這引出了另一個問題。 是否有來自不同製造商的不同類型的C++編譯器,或者它是否爲每臺計算機都內置? 根據你的評論'g ++編譯器',我想這不僅僅是一個編譯器,而是很多。 – GrinNare 2015-03-02 09:20:59

+0

是的有很多。最常見的兩個是來自微軟的'gcc'套件和'Visual',它們都有不同的版本。但是還有很多其他的。 'xcode'使用'llvm/gcc'。 – 2015-03-02 14:41:55

相關問題