。o vs .out in C

问题描述 投票:0回答:3

我在debian系统中使用gcc编译C代码。通常,我会使用gcc file.c -o file.out。但是我错误地键入了gcc file.c -o file.o。

[运行./file.o时,它仍然有效!

这是什么.o文件,与.out一样吗?

c file output
3个回答
2
投票

按照惯例,.o后缀是object代码。 GCC和其他编译器实际上在编译时需要执行几个步骤。在较高级别上,它看起来像这样**:

  1. 预处理器。这样可以解析您的#define#include以及其他#...宏。此步骤很少输出到文件-几乎普遍将其直接传递到下一步。
  2. 对象编译。代码行转换为机器代码和符号表。符号表尚未链接到可执行文件中。对于较大的程序,这是编译多个可能相互依赖的文件时的中间输出。
  3. 链接。现在,目标代码中的符号将解析为实际的存储位置或调用点,以提供完整的可执行文件。

**是的,这是一个简化的视图,省略了优化,调试符号,剥离,库链接和其他一些步骤,但是在编译过程中也可以将其视为子步骤。

按照惯例:

  • C文件分别命名为.c.h
  • C ++:.cpp.hpp.c++.h++
  • 目标文件被命名为.o
  • Fortran为.f
  • 程序集是.as
  • 静态库在UNIX上是.a在Windows上是.lib
  • 动态库在UNIX上是.so在Windows上是.dll
  • 可执行文件在UNIX上通常没有扩展名,在Windows上没有.exe扩展名,尽管未指定输出名称的链接C和C ++程序默认为a.out

没有上述理由或要求,除了那是自70年代以来所做的,这就是程序员的期望。


0
投票

当调用gcc时不带选项告诉它产生不同类型的输出时(例如-c创建目标文件-S创建程序集文件),它将创建一个可执行文件。这样做与您给该文件的扩展名无关。因此,在您的情况下,file.o是一个可执行文件,与任何其他可执行文件一样,无论其扩展名如何。

按照惯例,.o扩展名是针对目标文件的,而可执行文件应没有扩展名(即使默认名称为a.out,其扩展名是.out,该扩展名也不常用)。您通过命名文件.o打破了惯例,但是,除了造成混淆之外,这没有实际意义。]

命名文件.o不会告诉gcc应该创建目标文件。只有-c选项可以执行此操作。由于未通过该选项,因此未创建目标文件。


0
投票

.o文件是由编译器从源代码编译的目标文件。这是原始二进制文件,尚未与任何平台相关的库链接。您不能只在系统上运行.o文件。

© www.soinside.com 2019 - 2024. All rights reserved.