繁体   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