[英]How can I cross-compile for Solaris with cgo?
我正在嘗試為 Solaris 編譯一些cgo代碼。 嘗試構建時出現以下錯誤:
$ CGO_LDFLAGS="-L$(pwd)/solaris-11.4-amd64-libs" CGO_CFLAGS='-I/home/shane/src/ioctl-experimentation/solaris-11.4-headers -Wno-unknown-pragmas' CGO_ENABLED=1 GOOS=solaris GOARCH=amd64 go build # runtime/cgo /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start': (.text+0x16): undefined reference to `__libc_csu_fini' /usr/bin/ld: (.text+0x1d): undefined reference to `__libc_csu_init' /usr/bin/ld: (.text+0x2a): undefined reference to `__libc_start_main' /usr/bin/ld: $WORK/b003/_x003.o: in function `_cgo_release_context': gcc_context.c:(.text+0x5c): undefined reference to `__stack_chk_fail' /usr/bin/ld: $WORK/b003/_x004.o: in function `x_cgo_sys_thread_create': gcc_libinit.c:(.text+0x87): undefined reference to `__stack_chk_fail' /usr/bin/ld: $WORK/b003/_x004.o: in function `_cgo_wait_runtime_init_done': gcc_libinit.c:(.text+0x121): undefined reference to `__stack_chk_fail' /usr/bin/ld: $WORK/b003/_x004.o: in function `_cgo_try_pthread_create': gcc_libinit.c:(.text+0x291): undefined reference to `__stack_chk_fail' /usr/bin/ld: $WORK/b003/_x006.o: in function `x_cgo_init': gcc_solaris_amd64.c:(.text+0xb6): undefined reference to `__stack_chk_fail' /usr/bin/ld: $WORK/b003/_x006.o:gcc_solaris_amd64.c:(.text+0x214): more undefined references to `__stack_chk_fail' follow collect2: error: ld returned 1 exit status
我在 Linux 上進行交叉編譯。 這是我的 Go 版本:
$ go version go version go1.18.3 linux/amd64
solaris-11.4-amd64-libs
目錄包含來自 Solaris 11.4 AMD64 機器的/lib/amd64
下所有文件的副本。 solaris-11.4-headers
目錄包含來自 Solaris 11.4 AMD64 機器的/usr/include
下所有文件的副本。
這是我在main.go
中的 Go 代碼:
//go:build solaris
// +build solaris
package main
import "C"
func main() {
}
我知道從 Go 1.5 開始,Solaris 完全支持 cgo ,我正在使用 Go 1.18。
我正在尋求幫助來理解為什么會發生這些 linker 錯誤,即使我從/lib/amd64
目錄復制了所有庫。 是否有可能我還需要從其他地方復制更多的庫?
我將假設 Solaris 需要libxnet
,這就是自動添加的原因。
首先用sudo find /lib libxnet*
確認 libxnet 庫應該在哪里。 我希望您會看到 output 顯示的一行:
lib/64/libxnet.so
Assuming you see the above output, I believe you just need to tell the linker to look in that location with CGO_LDFLAGS="-L/lib/64" CGO_ENABLED=1 GOOS=solaris GOARCH=amd64 go build
. 如果可行,那么您應該能夠將該 LDFlag 嵌入到您的main.go
文件中:
// #cgo LDFLAGS: -L/lib/64
import "C"
嵌入后,您無需顯式設置CGO_LDFLAGS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.