【问题标题】:How to link a simple program in Windows with Mingw GCC如何将 Windows 中的简单程序与 Mingw GCC 链接
【发布时间】:2017-02-07 15:19:45
【问题描述】:

我有一个简单的“Hello World!” 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 是做什么的? “没有任何效果”不是对错误情况的非常有用的描述。
  • gcc 是编译器。该命令将完成所有工作以生成可执行文件。我一步一步走。现在我处于最后一步,我想与链接器(ld)链接。
  • 你为什么要链接?这里有汇编文件吗?您的总体目标是什么(链接程序集和 C 文件?)?
  • @amanuel2:装配与这些有什么关系?无论生成它的源语言如何,您都需要链接目标代码。那很可能是 C。
  • @amanuel2 我已经提到了我想做的事情。我想链接 hello.o,以生成可执行文件。这不是链接器应该做的(在累积所有库之后)。顺便问下为什么投反对票?

标签: c windows gcc linker mingw


【解决方案1】:

即使你对澄清问题的回答不是特别有用:

试试类似的东西

ld hello.o -lmsvcrt -entry=_main -subsystem=console -o hello.exe

如果您想查看标准 gcc 使用的链接器命令行,请像这样调用 gcc:

gcc test.c -o test -Wl,-v

最后一行输出是你应该使用的......

【讨论】:

  • 输出:ld:找不到 -lmsvcrt。我不敢相信它应该这么复杂。仍在搜索中。会更新。
  • 它是如此复杂。如果您使用编译器前端 gcc,这将使您摆脱这种复杂性。 Mingw 是为使用 MSC 运行时而构建的。在我的安装中,libmsvcrt.a 在 \MingW\lib 中 - 也许您需要在它所在的目录中添加 -L。
  • 查看上面的编辑以了解编译器前端如何调用链接器。
【解决方案2】:

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

编译步骤:

gcc -c hello.c

链接步骤:

gcc -o hello.exe hello.o

或多合一:

gcc -o hello.exe hello.c

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

all: hello.exe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多