[英]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.