我在debian系统中使用gcc编译C代码。通常,我会使用gcc file.c -o file.out。但是我错误地键入了gcc file.c -o file.o。
[运行./file.o时,它仍然有效!
这是什么.o文件,与.out一样吗?
按照惯例,.o
后缀是object
代码。 GCC和其他编译器实际上在编译时需要执行几个步骤。在较高级别上,它看起来像这样**:
#define
和#include
以及其他#...
宏。此步骤很少输出到文件-几乎普遍将其直接传递到下一步。**是的,这是一个简化的视图,省略了优化,调试符号,剥离,库链接和其他一些步骤,但是在编译过程中也可以将其视为子步骤。
按照惯例:
.c
和.h
.cpp
和.hpp
或.c++
和.h++
.o
。 .f
。 .as
。.a
在Windows上是.lib
.so
在Windows上是.dll
.exe
扩展名,尽管未指定输出名称的链接C和C ++程序默认为a.out
。没有上述理由或要求,除了那是自70年代以来所做的,这就是程序员的期望。
当调用gcc
时不带选项告诉它产生不同类型的输出时(例如-c
创建目标文件-S
创建程序集文件),它将创建一个可执行文件。这样做与您给该文件的扩展名无关。因此,在您的情况下,file.o
是一个可执行文件,与任何其他可执行文件一样,无论其扩展名如何。
按照惯例,.o
扩展名是针对目标文件的,而可执行文件应没有扩展名(即使默认名称为a.out
,其扩展名是.out
,该扩展名也不常用)。您通过命名文件.o
打破了惯例,但是,除了造成混淆之外,这没有实际意义。]
命名文件.o
不会告诉gcc
应该创建目标文件。只有-c
选项可以执行此操作。由于未通过该选项,因此未创建目标文件。
.o
文件是由编译器从源代码编译的目标文件。这是原始二进制文件,尚未与任何平台相关的库链接。您不能只在系统上运行.o
文件。