首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++文件之间的差异

C++文件之间的差异
EN

Stack Overflow用户
提问于 2012-03-22 18:34:39
回答 4查看 1.1K关注 0票数 1

我刚刚开始了一个图形化的C++课程,我很难弄清楚它是怎样的。我们得到了一些启动代码,两个文件;一个类型为"C++ Source“,另一个类型为"C/C++头”。它应该是一个图形化的程序,用颜色填充屏幕。另外,我们使用一些自定义库,如SDL和GLM,在与这两个文件相同的文件夹中,有一个名为gml的文件夹和大量的子文件夹,我不会进入这些文件夹。

我已经下载了用于c++的mingw、cmake和VisualStudio11beta。

我尝试过为图形部分制作一个普通的Win32程序和一个表单应用程序,但是在编译时总是有问题。

我的问题:,你应该如何处理C++文件?我刚刚习惯了java,打开.java文件并粘贴到您的IDE中是非常容易的,处理C++让我非常困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-22 19:14:19

嗯..。从哪里开始..。

在其他语言的幕后发生的一些事情在C++中更容易看到。从C++获取二进制文件(例如可执行文件)的过程包括首先编译源代码(其中有子步骤,但编译器处理它们)以获得对象文件,然后由链接器链接这些对象文件以生成二进制文件。

理论上,您可以简单地#include项目中的所有cpp文件,并将它们全部编译在一起并进行“链接”(尽管没有什么可链接的),但这需要很长时间,更重要的是,在可能耗尽编译器可用内存的复杂项目中。

因此,我们将项目划分为编译单元,按照约定,.cpp文件表示单个编译单元。编译单元是项目中被编译以生成一个对象文件的部分。即使编译单元是单独编译的,但其中一些代码必须是通用的,以便它们中的代码片段可以使用其他代码实现的功能。.h文件通常用于此目的。事情基本上是在它们中声明的(某种程度上是宣布的),这样每个编译单元都知道当它是生成二进制文件的链接过程的一部分时所期望的。

图书馆也有问题。图书馆里主要有两种东西;

  • 已经实现了功能,以二进制文件的形式提供给您,其中包括几乎可以运行的CPU指令(但它们必须插入正确的位置)。此表单附带.h文件,以便让您的.cpp文件知道库中期望的内容。
  • 第二种类型的功能直接在.h文件中实现。是的,这在特殊情况下是可能的。有些情况下,实现必须(弱必须)伴随声明(内联函数、模板类型等)。

第一种类型有两种类型:“静态库”( windows中的.lib,linux中的.a ),它进入可执行文件并在链接过程中成为它的一部分,以及“动态库”,它暴露在二进制文件中(因此它知道它),但它没有成为它的一部分。因此,您的可执行文件将查找动态库( windows中的.dll文件和LinuxF.X中的.so文件)。就在它运行的时候。

因此,为了使您的.cpp文件能够从库中接收服务,它们必须对它们的.h文件进行#include,以了解其中的内容。稍后,在链接期间,您必须显示链接器在哪里(文件系统中的路径)才能找到这些库的二进制组件。最后,如果库是动态的,则..dll(或. .so's )。必须在运行时可访问(例如,将它们保存在同一个文件夹中)。

在编译编译单元时,您必须告诉编译器在哪里可以找到.h文件。否则,它将看到的将是#include <something.h>,它将不知道在哪里找到该文件。对于gcc,您可以使用-I选项告诉编译器。请注意,你只需告诉文件夹。同样重要的是,如果include指令看起来像#include<somefolder/somefile.h>,那么您不应该在路径中包含somefolder。因此,调用类似于:

代码语言:javascript
复制
g++ mycompilationunit.cpp -IPATH/TO/THE/INCLUDED/FILES -IPATH/TO/OTHER/INCLUDED/FILES -c

-c选项告诉编译器,它不应该仅仅从这个编译单元创建一个可执行文件,因此它创建了一个.o文件,以便稍后与其他文件链接。因为我们不告诉它输出文件名,所以它会发出mycompilationunit.o

现在我们想要生成二进制文件(您可能需要一个可执行文件,但也可以创建您的库)。所以我们必须告诉链接器所有进入二进制文件的内容。所有对象文件和所有静态和动态库。所以,我们说:(注: g++在这里也充当链接器)

代码语言:javascript
复制
g++ objectfile1.o objectfile2.o objectfile3.o -LPATH/TO/LIBRARY/BINARIES -llibrary1 -llibrary2 -o myexecutable

在这里,-L选项在示例中是不言自明的。-l选项指示要查找哪些二进制文件。如果在路径上找到静态库和动态库,则链接器将同时接受它们;如果同时找到静态库和动态库,则选择一个库。请注意,-l后面的内容不是完整的二进制名称。例如,在linux库中,名称采用liblibrary.so.0形式,但在linker命令中被称为-llibrary。最后,-o告诉编译器可执行文件的名称。你需要一些其他的选择去做f.x。创建一个动态库,但您现在可能不需要了解它们。

票数 7
EN

Stack Overflow用户

发布于 2012-03-22 18:39:50

What is the difference between a .cpp file and a .h file?

看看这个答案。此外,一个快速的谷歌搜索也解释了一点。

.h (头)文件基本上是解密文件,.cpp (源文件)文件是定义文件。可以将两个文件合并到一个.cpp文件中,但是随着项目越来越大,它变得烦人,几乎不合理。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-03-22 18:40:42

在C++中有一个函数声明(函数签名)和一个函数定义(实际代码)的概念。

头文件(*.h)包含函数和类的声明。源文件(*.cpp、*.c++、*.C)包含定义。

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

在C++中定义类时,通常只包含成员函数的声明( Java中的方法),并将类定义放入头文件中。包含每个函数主体的成员函数定义通常放在类定义之外并放入源文件中。

通常,这里最好的做法是获得一本关于C++或C的书,并查看一些示例代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9828402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档