Featured image of post 出现 error: ld returned 1 exit status 的五种原因以及解决方法

出现 error: ld returned 1 exit status 的五种原因以及解决方法

CSDN 等国内平台上的文章只提到了一丁点,故看了半天 Stack OverFlow 后写篇博客解释

这个错误让人懵圈的地方就在于它不会给出错误出现的位置,让已经写了几百行的你痛不欲生。

可执行文件被占用了

因此编译器无法覆盖旧的可执行文件,所以编译失败。

这很有可能是你没发现它还没结束运行。

(我目前在用的 IDE:Visual Studio Code

扩展:C/C++ Compile Run(可以方便地编译单个 cpp 文件,且不会因为路径中存在空格或中文出错。)

解决方案

Dev C++ 等 IDE 直接把弹出的窗口(黑框)关了就行了

VS Code 可以从输出切换到终端选项卡,使用快捷键 Ctrl+C 结束程序(同样适用于 external console )。

实在不行就用任务管理器和 taskkill 吧

主函数不存在(main 拼写错误)

你不太可能不写主函数,但是你很有可能把 main 打成 mian 或者什么其他奇怪的东西。

在编译器眼里,这些可不能算主函数。

解决方案

main 拼对。

所调用的函数仅进行了声明

这种情况下新版编译器仍旧会输出 error: ld returned 1 exit status 这一让人迷惑的错误。 但是一般也不会把函数体和声明分开写吧…

(函数声明在主函数上方即可,函数体是可以写在 main 函数下方的。)

解决方案

把漏写了的函数体补上。

(旧版编译器)在主函数中定义了函数

新版编译器发现你在 main 函数中定义了其它函数报错并不是error: ld returned 1 exit status

而是error: a function-definition is not allowed here before '{' token Snipaste_2021-08-22_19-30-32.png

解决方案

把子函数定义在主函数外面。

(旧版编译器)调用了不存在的函数

一般情况下应该是所需头文件未引入或者函数名键入错误。

并不确定“scanf/printf 键入错误”是不是真的会引起该错误(CSDN 上的一篇博客说的,我也懒得去装个旧版编译器实测),是不是只有 scanf 和 printf 会这样更不得而知…

总之新版编译器即使在 CSDN 博文中所谓的“代码较多的情况”下也不会因为这个原因出现这种错误,只会告诉你这个函数在这个作用域没有被定义过,甚至还会反问你:

你说的是 scanf 吗?

(测试用代码是随机跳题后从这里复制的,并未提交评测)

解决方案

检查函数名称的拼写是否正确。

如果想调用库函数但不清楚应该引入什么头文件,可以在搜索引擎上像这样搜索:

sqrt() 所在的头文件

C++ sqrt()

C语言 sqrt()

或者直接 #include <bits/stdc++.h>

本文的测试环境

1
2
3
4
g++ (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

编辑记录

2021-08-22 19:20:00

未经许可禁止任意形式的商业或非商业转载。
最后更新于 Oct 20, 2021 23:00 UTC
点击这里在 Feeds Pub 上订阅本站
主站由 Vercel 驱动,如遇主站无法访问请尝试访问这些镜像:GitHub PagesCloudflare PagesNetlify(应该能实时同步)。
由于静态站点 + Serverless 部署的局限性,我引入了 Google Analytics 来收集访问数据;这些数据只是我自己看着玩的,不会被泄露;
您大可屏蔽它的 Cookie,这不会影响您浏览本站的所有内容或发表评论。
本站通过 Cloudflare Proxy 支持 IPv6 访问,但有时 Proxy 导致证书无法更新等问题时可能会关闭,届时请尝试访问镜像。
萌ICP备 20213003号
Built with Hugo
主题 StackJimmy 设计