我知道这表示链接器问题,主要是未解析的符号。我知道要解决这个问题/摆脱那个错误消息,就必须提供更多的信息。我知道在SO上解决这些问题还有很多问题。
我的问题旨在帮助理解make和ld,找出什么(以及谁)试图用这条线表达什么。
collect2: ld returned 1 exit status
答案 0 :(得分:22)
首先,您需要知道名为gcc
和g++
的命令行程序只是围绕实际预处理程序/解析器 - 编译器/汇编程序/链接程序命令的伞形(包装程序)。他们的真实姓名分别是cpp
,cc1
或cc1plus
,as
和ld
。 GCC有助于统一它们的使用,命令行界面并为它们提供一组有意义的默认(和必需)动作。例如,使用ld直接链接二进制文件非常困难 - 如果ld没有运行所有20+(IIRC)正确的选项,它就无法工作。
现在你知道了,你可以看到:
这是否意味着我正在使用ld?我配置了我的项目/ Makefile,以便g ++应该进行链接,那么为什么LD仍然参与
它意味着你调用GCC但反过来调用LD。 GCC本身一无所知 - 既不编译,也不知道链接,因为它只是一个包装器。 (在wc -c
上做一个/usr/bin/gcc
并惊讶它只有几千字节!现在为/usr/libexec/gcc/cc1plus
做同样的事情并找出可怕的事实:它是几个10兆的大!)
“collect2:”是什么意思?这是一个调用的步骤吗?我在我的系统上找不到具有该名称的可执行文件。
Collect2也是gcc和ld之间的另一个间接层。 More about it on its official website.
谁在写这封信?做? ld? g ++?
g ++(就我所知而言)或collect2
本身也许。
是否有可能的退出代码列表?
意思是传统的 - 零意味着成功,非零意味着失败。如果存在详尽的列表,则应该可以通过调用man ld
来查看它。
答案 1 :(得分:3)
正如H2CO3所暗示的,并且为了了解手动链接的难度,尝试使用详细开关(-v)运行g ++。它将输出流程中所有步骤的命令(以及其他一些信息)(预处理,编译,汇编,链接)。
例如,在Cygwin上使用g ++构建一个简单的“Hello,World”,产生:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/collect2.exe -Bdynamic --dll-search-prefix=cyg
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../crt0.o -L . -L/usr/lib/gcc/i686-pc-cygwin/3.4.4
-L/usr/lib/gcc/i686-pc-cygwin/3.4.4 -L/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../..
/tmp/cc4btl0k.o -lfoo -lstdc++ -lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc
...用于连接阶段。