将.o文件转换为.exe文件

13

能否将从.c源代码创建的目标文件.o转换为.exe可执行文件?如果可能,是否有使用gcc的直接命令?


2
你说的 .exe 是指 Windows 可执行文件还是 Linux 可执行文件? - TheJuice
1
为了避免进一步的混淆,您的解决方案在sepp2k的答案中。.o文件是一个目标文件,它是编译源文件的结果。你可以说它是完整可执行文件和源文件之间的中间文件。为了将(或多个)目标文件“转换”(称为“链接”)为可执行文件,您必须通过链接器程序将其推送,对于gcc来说,这是-o标志。 - LukeN
2
@LukeN:-o标志不会影响gcc的操作。它只是允许您为生成的可执行文件命名,否则它将被称为a.out(或在Windows上类似于a.out.exe的名称)。 - sepp2k
我当时没有认真考虑我写的内容,是的,“-o”是输出文件,对此我很抱歉 :) - LukeN
2个回答

27
gcc foo.o -o foo.exe

11
假设你的.c文件中有main()函数,它依赖于其他的.c/.o文件,并且不需要链接到一些非标准/未包含的库,那么就是这样做的。 - leonbloy
qgb.o: 在函数 __static_initialization_and_destruction_0(int, int)' 中: /usr/include/c++/7/iostream:74: 对 std::ios_base::Init::Init()' 未定义的引用 - CS QGB

12

.o转换为.exe可能是可行的,具体取决于.o文件的内容。 .o必须满足.exe的要求之一,即包含一个main函数。

通常我会按主题将项目分成多个部分,每个部分都会被编译成一个.o文件。单独的部分无法转换为.exe,但是所有部分组合起来可以转换。

例如,如果我编译以下文件,则会生成一个.o文件:
{hello.c}

#include <stdio.h>

void Hello()
{
  puts("Hello");
  return;
}

接下来,我编译:

gcc -c hello.c -o hello.o

这将创建 hello.o 文件。由于它没有起始函数,因此无法将其转换为 .exe 文件,它只是一些信息。

但是,以下文本可以从 .o 转换为 .exe:
{main.c}

#include <stdio.h>
int main(void)
{
  puts("Hello from main.\n");
  return 0;
}
创建一个 .o 文件:
  gcc -c -o main.o main.c

由于它有一个入口点,语言的定义命名为main,因此main.o可以转换为.exe

  gcc -o main.exe main.o

简而言之,有些.o文件可以转换为.exe,而有些则不能。在C和C++语言中,.o文件必须具有 main 函数才能成为可执行的.exe文件。注意:在C和C++语言规范中,在创建可执行文件之前不需要将代码翻译成.o文件。


这可能已经有两年的历史了,但为什么您第一次使用 gcc -c hello.c -o hello.o 创建 .o 文件,然后第二次使用 gcc -c -o main.o main.c 而不是 gcc -c main.c -o main.o 来创建 .o 文件? - jII
@jesterII:hello.c文件演示了如何创建独立的.o文件。main.c文件演示了如何将独立的.o文件转换为exe文件。hello.c不能转换为exe文件,除非与包含入口点的另一个文件链接。 - Thomas Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接