collect2: 错误:ld 因信号 11 [段错误] 而终止,核心已转储。

9

我曾使用GLFW学习OpenGL,当时对makefiles并不是很了解。虽然OpenGL可以运行,但我决定更深入地学习makefiles。经过多个网站的参考、数小时的学习和尝试,我总结出以下内容:

EXENAME = "OpenGL Demo"
CC = gcc
SRCS = ../src/OpenGLDemo.c
OBJS = $(SRCS: .c = .o)
CFLAGS = -Wall -g -c
LIBS = -L./libs -lglfw3 C:/Windows/SysWOW64/opengl32.dll C:/Windows/SysWOW64/glu32.dll

all: opengldemo exe

exe: $(OBJS)
    $(CC) $(OBJS) -o $(EXENAME) $(LIBS)

opengldemo: ../src/OpenGLDemo.c
    $(CC) $(CFLAGS) ../src/OpenGLDemo.c

clean:
    rm -f $(EXENAME)

rebuild: clean all

但是,当我编译时,在尝试构建可执行文件时会出现以下错误:
collect2: error: ld terminated with signal 11 [Segmentation fault], core dumped
makefile:11: recipe for target 'exe' failed
make: *** [exe] Error 1

它确实构建了一个可执行文件,但我的计算机却无法运行它。我尝试搜索互联网,并找到了包括此错误的gcc错误报告。我可能做了一些愚蠢的事情导致这个错误。我该怎么解决这个错误,它是什么意思?
编辑:完整输出:
make
gcc -Wall -g -c ../src/OpenGLDemo.c
gcc ../src/OpenGLDemo.c -o "OpenGL Demo" -L./libs -lglfw3
C:/Windows/SysWOW64/opengl32.dll C:/Windows/SysWOW64/glu32.dll
cygwin warning:
  MS-DOS style path detected: C:/Windows/SysWOW64/opengl32.dll
  Preferred POSIX equivalent is: /cygdrive/c/Windows/SysWOW64/opengl32.dll
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
collect2: error: ld terminated with signal 11 [Segmentation fault], core dumped
makefile:11: recipe for target 'exe' failed
make: *** [exe] Error 1

@CarlNorum 那基本上就是输出。不过既然你问了,我会补充剩下的内容。 - Znapi
你尝试修复一下它警告你的路径名了吗? - Carl Norum
3
如果编译器、链接器、make工具链的任何一部分崩溃,这不是程序员的错。无论你做了什么蠢事,工具都不应该崩溃。 - n. m.
@CarlNorum 我不敢这样做,因为我正在Windows上为Windows编译。 - Znapi
如果我更改路径名,那个警告就会消失,但仍然出现相同的错误。 - Znapi
显示剩余2条评论
2个回答

9

我遇到了完全相同的错误。

我同时在Windows和Linux上进行开发,并使用Filezilla传输文件。代码之前在Windows上使用Cygwin构建,但在从Linux主机下载文件后无法构建。

流程是:在Windows上构建==>上传到Linux并构建==>进行一些更改==>下载到Windows并构建==>出现错误。

然后我意识到我已经将Linux对象文件与源代码一起传输,因此我删除了所有.o文件,构建顺利完成。

我不知道这是否是@Zaerospi的问题,但似乎是我的错误源头。

其他遇到同样错误的人可能想尝试删除他们的对象文件并重新构建。


非常感谢。顺便说一下,在32位cygwin上运行“file”命令应该显示“80386 COFF可执行文件未剥离”,而在64位cygwin上应该显示“data”。如果它们显示其他内容,则可能是意外的Linux衍生版本。例如,Linux 32位的输出为:“ELF 32位LSB可重定位文件,Intel 80386,版本1(SYSV),未剥离”,64位类似。 - rogerdpack

4
这意味着ld工具或其依赖项存在错误,导致无效的内存访问(分段错误),操作系统使用SIGSEGV(信号11)终止进程。不管您的构建设置如何,它都不应该崩溃。
您应该向Linux发行版供应商或ld工具的供应商(通常是GNU,如果您的ld工具来自GNU binutils)提交错误报告。

1
没有直接的解决方案。要么开始调试它,要么获取一个新的'ld'。但是因为您似乎正在使用cygwin,这两个解决方案可能都有问题。在Linux上,我会使用“strace -f”或“valgrind--track-origins=yes—trace-children=yes”等方式开始调试,但在cygwin上可能无法使用这些方法。但是,您可能比我更熟悉cygwin。 - jotik
我刚刚收到了类似的错误,并确认这是cygwin的问题。我将整个项目复制到了一台真正的Linux机器上,一切都编译得很好。 - Friend of Kim

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