簡體   English   中英

C ++文件之間的區別

[英]Difference between C++ files

我剛剛開始了圖形C ++課程,但在獲取概述時遇到了問題。 我們得到了一些起始代碼,兩個文件; 一種類型為“ C ++ Source”,另一種類型為“ C / C ++ Header”。 它應該是一個用彩色填充屏幕的圖形程序。 另外,我們使用一些自定義庫,例如SDL和GLM,在與這兩個文件相同的文件夾中,有一個名為gml的文件夾和許多子文件夾,我不會進入。

我已經下載了mingw,cmake和Visual Studio 11 beta for c ++。

我曾嘗試制作一個普通的Win32程序以及一個圖形部分的表格應用程序,但是在編譯時總是出錯。

我的問題:您應該如何處理C ++文件? 我剛剛習慣了Java,打開.java文件並將其粘貼到您的IDE中非常容易,使用C ++會讓我感到非常困惑。

嗯...從哪里開始...

其他語言在幕后發生的事情在C ++中更為明顯。 從C ++獲取二進制文件(例如可執行文件)的過程包括首先編譯源代碼(此過程有一些子步驟,但是編譯器會處理它們)以獲取目標文件,然后由鏈接器鏈接目標文件以生成二進制文件。

理論上,您可以簡單地#include所有cpp文件包含在項目中,然后將它們全部編譯在一起並“鏈接”(盡管沒有鏈接),但這將花費很長時間,更重要的是,在復雜的項目中,耗盡編譯器可用的內存。

因此,我們將項目分成編譯單元,按照慣例,.cpp文件代表一個編譯單元。 編譯單元是項目的一部分,將被編譯以生成一個目標文件。 即使編譯單元是單獨編譯的,它們之間也必須有一些共同的代碼,以便它們中的每個代碼都可以使用其他代碼所實現的功能。 .h文件通常用於此目的。 事情基本上是在它們中聲明的(宣布的),因此每個編譯單元都知道當它是生成二進制文件的鏈接過程的一部分時會發生什么。

庫也有問題。 您可以在庫中找到兩種主要的東西:

  • 已經實現的功能已經以二進制文件的形式提供給您,其中包括幾乎可以運行的CPU指令(但必須將它們插入正確的位置)。 該表格隨附.h文件,以使您的.cpp文件知道在庫中期望什么。
  • 第二種類型是直接在.h文件中實現的功能。 是的,在特殊情況下這是可能的。 在某些情況下,實現必須(弱)必須伴隨聲明(內聯函數,模板化類型等)一起使用。

第一種有兩種形式:一種是“靜態庫”(在Windows中為.lib,在Linux中為.a),它在鏈接過程中進入您的可執行文件並成為其一部分;而另一種類型是“動態庫”,該庫向您公開二進制文件(因此它知道它),但這並沒有成為它的一部分。 因此,可執行文件將在運行時尋找該動態庫(Windows中的.dll文件和Linux fx中的.so文件)。

因此,為了使您的.cpp文件能夠從庫接收服務,它們必須#include他們的.h文件,以了解其中的內容。 稍后,在鏈接期間,您必須向鏈接器顯示在何處(文件系統中的什么路徑)才能找到那些庫的二進制組件。 最后,如果庫是動態的,則必須在運行時訪問.dll(或.so等)(例如,將它們保存在同一文件夾中)。

在編譯編譯單元時,您必須告訴編譯器在哪里可以找到.h文件。 否則,它將僅顯示#include <something.h> ,並且不知道在哪里可以找到該文件。 使用gcc,您可以使用-I選項告訴編譯器。 請注意,您只是告訴文件夾。 同樣重要的是,如果include指令看起來像#include<somefolder/somefile.h> ,則不應在路徑中包含somefolder 因此,調用看起來像:

g++ mycompilationunit.cpp -IPATH/TO/THE/INCLUDED/FILES -IPATH/TO/OTHER/INCLUDED/FILES -c

-c選項告訴編譯器不應僅從此編譯單元嘗試生成可執行文件,因此它會創建一個.o文件,以便以后與其他文件鏈接。 由於我們沒有告訴它輸出文件名,因此它吐出了mycompilationunit.o

現在,我們要生成二進制文件(您可能想要一個可執行文件,但您可能還想創建一個自己的庫)。 因此,我們必須告訴鏈接程序進入二進制文件的所有內容。 所有目標文件以及所有靜態和動態庫。 因此,我們說:(請注意,這里的g ++也充當鏈接器)

g++ objectfile1.o objectfile2.o objectfile3.o -LPATH/TO/LIBRARY/BINARIES -llibrary1 -llibrary2 -o myexecutable

在此示例中,-L選項不言自明。 -l選項指示要查找的二進制文件。 如果鏈接器在路徑上找到靜態庫和動態庫,則鏈接器將接受它們;如果找到兩者,則鏈接器將選擇一個。 請注意,-l之后的不是完整的二進制名稱。 例如,在linux庫中,名稱的格式為liblibrary.so.0但在鏈接器命令中它們稱為-llibrary。 最后,-o告訴編譯器要為可執行文件指定的名稱。 您需要其他一些選項來fx創建動態庫,但是現在您可能不需要了解它們。

.cpp文件和.h文件有什么區別?

看這個答案。 快速谷歌搜索也解釋了一下。

.h(頭文件)幾乎是declecle,.cpp(源文件)是定義。 可以將兩個文件合並為一個.cpp文件,但是隨着項目越來越大,它變得煩人且幾乎不合理。

希望能有所幫助。

在C ++中,有一個函數聲明(函數簽名)和函數定義(實際代碼)的概念。

頭文件(* .h)包含函數和類的聲明。 源文件(* .cpp,*。c ++,*。C)包含定義。

頭文件可以使用#include指令包含在源文件中。

在C ++中定義類時,通常只包含成員函數的聲明(Java語言中的方法),然后將類定義放入頭文件中。 包含每個函數主體的成員函數定義通常放在類定義之外,並放入源文件中。

通常,這里最好的辦法是買一本有關C ++或C的書,並看一些示例代碼。

頭文件(.h)應該包含類,方法和變量的定義。 源文件(.cpp)將包含代碼。 因此,在您的.cpp文件中,您需要將頭文件包含為#include "header-file-name.h"

然后使用g ++編譯.cpp文件。 確保.h文件的路徑正確。

如果您使用的是CodeBlocks或Visual Studio,則只需編譯項目並運行即可為您完成所有工作。 您也可以從此處添加.h或.cpp文件。 您無需擔心任何事情。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM