登录
首页 >  Golang >  Go问答

golang 与 cgo 抛出错误collect2: error: ld returned 1 exit status

来源:stackoverflow

时间:2024-04-17 16:42:34 344浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《golang 与 cgo 抛出错误collect2: error: ld returned 1 exit status》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我正在编译一个golang包,其中包括使用cgo集成共享c库。 一切都在 docker 镜像 golang:1.15.15golang:1.16.6 中成功构建,但由于 golang:1.16.7 (还有 golang:1.17),它失败并出现错误:

/usr/bin/ld: src/foobar/lib/libXYZ.so: undefined reference to `feenableexcept'
/usr/bin/ld: src/foobar/lib/libXYZ.so: undefined reference to `floor'
...
/usr/bin/ld: src/foobar/lib/libXYZ.so: undefined reference to `memoFree'
/usr/bin/ld: src/foobar/lib/libXYZ.so: undefined reference to `memoMalloc'
collect2: error: ld returned 1 exit status

我检查了 golang 发行说明,没有找到 cgo 的任何相关更改。

我检查了 gcc 和 ld 的版本,它们都是不同的。我什至使用 go1.13.8gcc (ubuntu 8.4.0-3ubuntu2) 8.4.0gnu ld (gnu binutils for ubuntu) 2.34 设置了一个 ubuntu 发行版,我在其中遇到了这个问题,所以我猜,gozqbendc zqb 去不是造成它的原因。

您有任何线索或建议吗?我如何找到此问题的根本原因?检查 gcc 和 ld 是否正确,或者还需要调查哪些其他工具?


正确答案


感谢 Zyl,我能够缩小问题范围。

我检查了几个发行版(bullseye、buster、stretch),使用 bullseye 时,构建失败了。就我而言,来自 binutilsld 版本和 gcc 都没有导致问题。

看来,处理链接器 DT_NEEDED 标签的默认设置已更改。我解决了我的问题,从 https://stackoverflow.com/a/62117174/2290153 获取解决方案并将 export CGO_LDFLAGS=-Wl,--no-as-needed 添加到环境中。根据 https://manpages.debian.org/bullseye/binutils-common/gold.1.en.html,这是 ld.gold 链接器的默认值,但不是 ld 的默认值。

对我帮助很大的是 go build 命令的 -x 标志,可以查看为 cgo 执行的 gcc 命令。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《golang 与 cgo 抛出错误collect2: error: ld returned 1 exit status》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>