Linker “错误”;“未定义引用”;在MinGW中链接时

Linker “错误”;“未定义引用”;在MinGW中链接时,linker,mingw,Linker,Mingw,我使用MinGW从源代码中获得了对象文件 但关于链接: ld -o test.exe test.o 我收到错误,例如以下错误: 对printf的未定义引用 首先,你为什么直接使用ld 以下是“GCC和Make”教程的摘录,该教程位于 分别编译和链接 上述命令一步将源文件编译成目标文件,并与其他目标文件(系统库)链接成可执行文件。您可以按以下两个步骤分别编译和链接: // Compile-only with -c option > g++ -c -Wall -g Hello.cpp //

我使用
MinGW
从源代码中获得了
对象文件

但关于链接:

ld -o test.exe test.o
我收到错误,例如以下错误:

对printf的未定义引用


首先,你为什么直接使用ld

以下是“GCC和Make”教程的摘录,该教程位于

分别编译和链接

上述命令一步将源文件编译成目标文件,并与其他目标文件(系统库)链接成可执行文件。您可以按以下两个步骤分别编译和链接:

// Compile-only with -c option
> g++ -c -Wall -g Hello.cpp
// Link object file(s) into an executable
> g++ -g -o Hello.exe Hello.o
注:g++(如果您使用的是C而不是C++,则可以替换为gcc)用于编译和链接。ld根本不用

使用g++或gcc链接的好处是,它将自动链接到默认库,例如您需要为printf链接的库


要与其他库链接,请使用-l参数指定库名称,如-lmylib中所示。

我们可以通过命令查看编译器运行的命令

c99 -v test.o
我们会收到一些短信。包含“COLLECT\u CGG\u OPTIONS”的All after字符串将是ld的参数。
但可执行文件的大小要比以前得到的文件大得多。

我的老师要我用ld来做。我对-l键很敏感,但我不知道哪个库包含printf。我尝试了一下,得到了以下结果:
“未定义对”\uuuu main“的引用”
,然后我添加了-lgcc(在-lmsvsrt之前),得到了以下结果:
未定义对“\upei386\uruntime\urelocator”的引用。
我如何理解通常必须包含的内容?我不知道。这就是为什么最好使用gcc或g++进行链接,而不是ld。我在谷歌上搜索了一下,但没有找到解决这个问题的方法。事实上,我找到的每一个资源都提到了与gcc或g++的链接。