[英]golang with cgo throws error collect2: error: ld returned 1 exit status
我正在编译一个 golang 包,其中包括使用cgo
集成一个共享的 c 库。 一切都在golang:1.15.15
images golang:1.15.15
, golang:1.16.6
golang:1.16.7
内成功构建,但由于golang:1.16.7
golang:1.17
(也是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 的版本,这些都是不同的。 我甚至安装Ubuntu的发行版与go1.13.8
, gcc (Ubuntu 8.4.0-3ubuntu2) 8.4.0
和GNU ld (GNU Binutils for Ubuntu) 2.34
,在那里我遇到了这个问题,所以我想,那go
那张没有原因它。
您有任何线索或建议,我如何才能找到此问题的根本原因? 检查gcc和ld是否正确,或者其他哪些工具需要调查?
感谢 Zyl,我能够缩小问题的范围。
我检查了几个发行版(bullseye、buster、stretch),使用bullseye,构建失败了。 就我而言,来自binutils
和gcc
的ld
版本都没有导致问题。
看起来,用于处理链接器的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 命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.