【问题标题】:C++ When does class object file get compiled?C++ 什么时候编译类目标文件?
【发布时间】:2015-03-02 08:46:37
【问题描述】:

我是 C++ 新手,很难理解创建和编译类目标文件的步骤。

假设我创建了 3 个文件:1. 类头文件 2. 类 cpp 文件(存在成员函数定义) 3. 主 cpp 文件

/* 当我运行包含类头文件(比如“#include class.h”)的主 cpp 文件时,什么时候编译类 cpp 文件、创建和链接目标文件?

我遇到困难的原因是从编译器的角度来看,当它看到主cpp文件时,只有头定义,没有成员函数定义。但是,即使在类头文件中,也没有包含类 cpp 文件。当类头文件和主 cpp 文件中都没有引用它时,编译器如何知道运行类 cpp 文件? */

让我澄清一下我的问题。 // 也许我说了一些我什至不明白的事情,哈哈。

所以,基本上我试图在一个说“main.cpp”文件中运行一个主函数。此“main.cpp”文件包含“class.h”标头(包括“class.h”)。当“class.h”中未声明成员函数时,编译器将如何执行头文件中定义的函数?我所有的成员函数声明都在“class.cpp”中,它不包含在“class.h”或“main.cpp”中。

【问题讨论】:

  • C++ 中没有像“类对象文件”AFAIK 这样的东西,至少没有具体说明。此外,您不会“运行 cpp 文件”。为了理解你的问题,你如何用两个“cpp”文件编译一个项目?因为都是一样的,有没有类也没关系,你可以有一个cpp只定义一个函数。
  • @luk32 示例:Rectangle.h 包含在Rectangle.cpp 中,Rectangle.cpp 被编译并Rectangle.obj 被创建。我认为这就是 OP 所指的“类对象文件”。
  • @GrinNare 更新(编辑)您添加该评论的问题,并删除该评论。

标签: c++ class


【解决方案1】:

我怀疑您使用的是 IDE,因为您提到运行 cpp 文件 - 编译器不知道如何运行任何东西。

您的 IDE 会为您管理这些依赖项。
当您按下“运行”时,IDE 将决定您项目中的哪些文件需要编译,并且当编译完成时,它将所有目标文件链接在一起。
如果编译和链接成功,IDE 将启动可执行程序。

如果您想更好地理解这些概念,请离开您的 IDE,暂时在命令行上进行所有编译和链接。
(并不复杂,只是乏味。)

【讨论】:

  • 感谢您的回答。正如我所说,我是 C++ 新手,很多东西都是新的。我猜你提到的IDE是我正在使用的'Xcode'。所以这个程序会将文件传递给编译器,链接目标文件,并为我启动可执行程序,对吗?
【解决方案2】:

您需要编译每个.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

为了便于理解,这里过于简单化了。

【讨论】:

  • 感谢您的回答。现在我明白了这个过程。然而,这让我想到了另一个问题。是否有来自不同制造商的不同类型的 C++ 编译器,或者是否为每台计算机内置?根据您的评论“g++ 编译器”,我猜编译器不止一个,而是很多。
  • 是的,有很多。两个常见的是来自 Microsoft 的 gcc 套件和 Visual,它们都有不同的版本。但是还有很多其他的。 xcode 使用 llvm/gcc
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 2011-12-31
  • 2011-08-13
  • 2011-06-17
  • 2011-05-29
  • 2011-07-14
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多