【问题记录】c++编译报错~/bin/ld.exe: cannot find 0

2024-05-01 07:04

本文主要是介绍【问题记录】c++编译报错~/bin/ld.exe: cannot find 0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

构建环境

windows 11
cmake 3.29.0-rc2
MinGW 8.1.0

先说结论

推测这应该是MinGW和cmake版本的部分不兼容导致的,尝试使用旧一点的cmake或新一些的MinGW或许会解决这个问题。

诡异的 0 是怎么来的

首先这个程序没有链接任何外部库,也没导出任何库;
我通过添加cmake -- VERBOSE=1参数查看详细信息后发现问题出在build.make文件中的这一句命令

F:/MinGW/bin/c++.exe -g \
-Wl,--whole-archive CMakeFiles/print_hello_world.dir/objects.a \
-Wl,--no-whole-archive -o print_hello_world.exe \
-Wl,--out-implib,"" \
-Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/print_hello_world.dir/linkLibs.rsp

经过分析问题是在--out-implib,""这个参数,不明白cmake为什么会生成这一句,似乎这个版本的c++.exe没有将""识别为空 ,并且又把--major-image-version后面的主版本号0识别为了一个库,所以才出现了这个链接错误,删除-Wl,--out-implib,""或主版本号0后恢复正常,这里肯定是选择删除-Wl,--out-implib,""才符合语义。
另外如果链接了第三方库,反而不会出问题。

修正前报错~/bin/ld.exe: cannot find 0

F:/MinGW/bin/c++.exe -g \
-Wl,--whole-archive CMakeFiles/print_hello_world.dir/objects.a \
-Wl,--no-whole-archive -o print_hello_world.exe \
-Wl,--out-implib,"" \
-Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/print_hello_world.dir/linkLibs.rsp

修正后正常

F:/MinGW/bin/c++.exe -g \
-Wl,--whole-archive CMakeFiles/print_hello_world.dir/objects.a \
-Wl,--no-whole-archive -o print_hello_world.exe \
-Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/print_hello_world.dir/linkLibs.rsp

链接gtest静态库后

源码结构没有变化,但该行参数变成了-Wl,--out-implib,libtest_print_hello_world.dll.a

F:/MinGW/bin/c++.exe -g \
-Wl,--whole-archive CMakeFiles/test_print_hello_world.dir/objects.a \
-Wl,--no-whole-archive -o test_print_hello_world.exe \
-Wl,--out-implib,libtest_print_hello_world.dll.a \
-Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/test_print_hello_world.dir/linkLibs.rsp

gtp4给出的解释是这样的:

连接器(linker)被指令以特定的方式处理静态库和生成的输出。这不仅仅关于链接gtest.a。让我们逐一分析参数:

  1. -Wl,--whole-archive CMakeFiles/test_print_hello_world.dir/objects.a -Wl,--no-whole-archive: 这一段指示连接器将指定的静态库(objects.a)中所有的目标文件全部加入到最终的可执行文件中。--whole-archive 选项强制链接器不忽略任何目标文件,哪怕它们看起来并没有被使用。这通常用来确保库中可能会被程序运行时动态引用的对象都将被包含进来。
  2. -o test_print_hello_world.exe: 这指示生成的输出是一个名为 test_print_hello_world.exe 的可执行文件。
  3. -Wl,--out-implib,libtest_print_hello_world.dll.a: 这段指示连接器创建一个导入库(import library),名字叫做 libtest_print_hello_world.dll.a。在Windows平台,当你创建一个DLL的时候,你通常也会生成一个关联的导入库,它用于从DLL中链接函数。即使你的意图是创建一个可执行文件,连接器也可以生成这样一个导入库,它可以被其他的DLL或可执行文件使用,来链接到你的程序(尽管这在实际中并不常见)。

后缀.dll.a是在MinGW或Cygwin环境中使用的,它表示这是一个用于链接DLL的导入库。与.lib文件相比(通常在Native Windows环境中用作导入库),.dll.a 的格式略有不同,以符合GCC工具链的预期。

如果你的目标确实是生成一个独立的可执行文件,你可能不需要 --out-implib 参数,除非你打算将你的可执行程序输出一些接口给其他程序动态链接使用。只有在生成DLL时,--out-implib 通常才是必要的。

如果有进一步的混淆,你可以检查CMakeList.txt中的设置,或者是和其他库或目标的交互方式,来确定为什么这个命令行被这样配置。这可能需要你具体了解项目的构建系统配置。

这篇关于【问题记录】c++编译报错~/bin/ld.exe: cannot find 0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951007

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图