如何在Windows中使用Mingw GCC链接简单程序

5

我有一个简单的c程序,叫做hello.c,存放在我的桌面上:

#include <stdio.h>

int main() {
    printf("Hello world!\n");

    return 0;
}

我运行了以下命令。

  • 我使用以下命令进行预处理:cpp hello.c > hello.i
  • 我使用以下命令进行编译:gcc -S hello.i
  • 我使用以下命令进行汇编:as -o hello.o hello.s

到目前为止一切都很好。但是,我无法进行链接。除其他命令外,我尝试了以下命令:

ld -o hello.exe hello.o
ld -o hello.exe hello.o -lgcc
ld -o hello.exe hello.o -nostdlib -lgcc

什么都不起作用。我在每一种情况下都遇到了链接错误:

hello.o:hello.c:(.text+0x9): undefined reference to `__main'
hello.o:hello.c:(.text+0x15): undefined reference to `puts'

我该如何链接已组装的程序hello.o,以便最终生成可执行程序hello.exe?我漏掉了什么吗? [使用Windows 8.1,Mingw版本0.6.2。] 预先致谢。

gcc -o hello.exe hello.c 是什么意思?“什么都不起作用”并不是一个非常有用的错误描述。 - tofro
@RestlessC0bra 我要说,我没有给这个问题投反对票。是的,抱歉最近一直在使用链接器来组合C和汇编文件,有点混淆了 :/。 - amanuel2
我认为这个链接里有你需要的答案。https://dev59.com/K47ea4cB1Zd3GeqPAF_n - Lucas
@LucasHarskamp 不行,那里的回答都不起作用。它给了我上面提供的错误和更多错误。仍在努力解决。 - KeyC0de
因此,为了链接,我们必须键入gcc hello.o -o hello.exe。它会自动提供所有库。手动输入所有库可能是不可能的。 - KeyC0de
显示剩余5条评论
2个回答

1
即使您对澄清问题的回答并不特别有用:
尝试类似以下内容:
ld hello.o -lmsvcrt -entry=_main -subsystem=console -o hello.exe
如果您想查看标准gcc使用的链接器命令行,请像这样调用gcc:
gcc test.c -o test -Wl,-v
最后一行的输出是您应该使用的内容...

输出:ld: 找不到 -lmsvcrt。我无法相信它应该如此复杂。 仍在搜索中。将更新。 - KeyC0de
2
这真的很复杂。如果你使用gcc编译器前端,就可以解决这些复杂性了。Mingw是为使用MSC运行时而构建的。在我的安装中,libmsvcrt.a位于\MingW\lib目录下 - 也许你需要向你的目录添加一个-L参数。 - tofro
请参见上面的编辑,以了解编译器前端如何调用链接器。 - tofro

1
如果您想编译某些东西而不是尝试工具,请勿直接使用链接器进行链接。使用gcc,它将使用正确的选项为您调用链接器:

编译步骤:

gcc -c hello.c

链接步骤:
gcc -o hello.exe hello.o

或者全部放在一起:

gcc -o hello.exe hello.c

你也可以使用简单的Makefile,然后运行make

all: hello.exe

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