【问题标题】:Why do we need object files? [duplicate]为什么我们需要目标文件? [复制]
【发布时间】:2021-10-27 06:54:56
【问题描述】:

为什么我们需要目标文件?我尝试使用命令g++ -o main.exe main.cpp (other files).cpp 链接多个文件,它可以工作。但是从网上的教程看,需要先用g++ -c main.cpp (other files).cpp命令把文件转成*.o文件,再用g++ -o main.exe main.o (other files).o把文件链接起来。如果我们可以对g++ -o main.exe main.cpp (other files).cpp 做同样的事情,为什么我们需要先将文件转换为*.o?

【问题讨论】:

  • 这能回答你的问题吗? What is *.o file?
  • 假设您有一个 300 万行的 c++ 项目。您更改一行代码。你想每次都重新编译整个东西吗?或者您是否想要一种机制,您可以重新编译您更改的文件并重用其余文件?是的,对于小型项目,您可能看不到重点。想大局。
  • 此外,C++ 编译通常是内存密集型的。无论如何,您实际上无法一次编译数百万行。
  • @dratenik 您的意思是 *.o 文件将允许您重新编译其中一个文件而不是所有文件吗?还是相反?因为现在我只是在每次更改后一次又一次地运行命令。
  • 库通常只是某种形式的目标文件的集合(扩展名为.lib.a.so.dll)和相应的 API(头文件)。跨度>

标签: c++ g++


【解决方案1】:

TL;DR 版本:

您不需要创建目标文件。直接编译成可执行文件就好了。

长版:

您无需在此处显式创建目标文件。但是,请注意编译器确实将这些目标文件创建为每个源文件的中间文件。一旦编译器拥有了所有可用的目标文件,链接器就会发挥作用,并将每个函数的定义与实现(以及其他内容)相匹配。链接器最终会创建可执行文件并删除目标文件,因为您没有要求它们。

但是,您可以要求编译器使用问题中所述的命令存储这些中间文件。

正如 cmets 中所述,仅编译在上一个开发周期中发生更改的源文件几乎总是一种好习惯。这需要您拥有可用于未更改的源文件的目标文件。我只是想说直接编译是合法的

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2018-11-02
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多