amd64主机交叉编译Golang SDL2静态库到树莓派时缺失依赖报错
问题:amd64主机交叉编译Go+SDL2应用到树莓派2时链接失败
交叉编译时出现以下链接错误:
... cp $WORK/b058/_pkg_.a /.cache/go-build/23/23b77813791e651c39389b15d7f9981669cdee14675f76b632daaa86ced9fc66-d # internal # github.com/veandco/go-sdl2/img /usr/lib/gcc-cross/arm-linux-gnueabi/10/../../../../arm-linux-gnueabi/bin/ld: cannot find -lz /usr/lib/gcc-cross/arm-linux-gnueabi/10/../../../../arm-linux-gnueabi/bin/ld: cannot find -liconv /usr/lib/gcc-cross/arm-linux-gnueabi/10/../../../../arm-linux-gnueabi/bin/ld: cannot find -lbcm_host /usr/lib/gcc-cross/arm-linux-gnueabi/10/../../../../arm-linux-gnueabi/bin/ld: cannot find -lvcos /usr/lib/gcc-cross/arm-linux-gnueabi/10/../../../../arm-linux-gnueabi/bin/ld: cannot find -lvchiq_arm collect2: error: ld returned 1 exit status ...
环境信息
- 运行环境:amd64 Ubuntu上的Debian 10(Bullseye)Docker容器
- go.mod配置:
module example.com/sdl-example go 1.19 require github.com/veandco/go-sdl2 v0.4.33
- Dockerfile内容:
FROM golang:1.19-bullseye RUN dpkg --add-architecture armhf && \ apt-get update && apt-get upgrade -y && \ apt-get install -y \ apt-utils \ build-essential \ glibc-source \ libc6-armhf-cross \ libc6-dev-armhf-cross \ libc6-dev:armhf \ zlib1g-dev:armhf \ cmake:armhf \ autoconf:armhf \ libtool:armhf \ gcc-arm-linux-gnueabi \ crossbuild-essential-armhf \ binutils-arm-linux-gnueabi \ libsdl2-dev:armhf \ libsdl2-ttf-dev:armhf \ libsdl2-image-dev:armhf RUN mkdir /.cache && chmod a+rwx /.cache WORKDIR /build
- 构建脚本:
#!/bin/bash export GOOS=linux export GOARCH=arm export GOARM=6 export CGO_ENABLED=1 export CC=arm-linux-gnueabi-gcc export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig export LD=arm-linux-gnueabi-ld export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/arm-linux-gnueabi/lib go mod download -x \ && echo -e "Verify..." \ && go mod verify \ && echo "OK" go build -v -work -x -tags static -o builds/arm5
- 示例代码main.go:
package main import ( "github.com/veandco/go-sdl2/sdl" ) func main() { if err := sdl.Init(sdl.INIT_EVERYTHING); err != nil { panic(err) } defer sdl.Quit() window, err := sdl.CreateWindow("test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, 800, 600, sdl.WINDOW_SHOWN) if err != nil { panic(err) } defer window.Destroy() surface, err := window.GetSurface() if err != nil { panic(err) } surface.FillRect(nil, 0) rect := sdl.Rect{0, 0, 200, 200} colour := sdl.Color{R: 255, G: 0, B: 255, A: 255} // purple pixel := sdl.MapRGBA(surface.Format, colour.R, colour.G, colour.B, colour.A) surface.FillRect(&rect, pixel) window.UpdateSurface() running := true for running { for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { switch event.(type) { case *sdl.QuitEvent: println("Quit") running = false break } } } }
用户疑问:静态编译SDL2时反复出现该错误,担心发行版未提供缺失库,该如何解决?
解决方案
1. 补充安装缺失的交叉编译依赖包
错误中缺失的库对应以下armhf开发包,修改Dockerfile的apt-get install部分,添加这些包:
# 在原有包列表后添加 libcharset-dev:armhf \ libraspberrypi-dev:armhf \ zlib1g-static:armhf
libcharset-dev:armhf:提供iconv相关的静态库libraspberrypi-dev:armhf:提供树莓派硬件相关的bcm_host、vcos、vchiq_arm库zlib1g-static:armhf:确保zlib的静态库存在
2. 修正PKG_CONFIG_PATH环境变量
构建脚本中PKG_CONFIG_PATH设置为aarch64路径,这是错误的,需要改为armhf的pkgconfig路径:
export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabi/pkgconfig
这样pkg-config才能正确找到SDL2等armhf库的配置文件。
3. 调整静态编译参数(可选)
如果仍然存在链接问题,可以在go build命令中添加额外的链接参数,强制指定静态库路径:
go build -v -work -x -tags static -ldflags="-L/usr/arm-linux-gnueabi/lib -lz -liconv -lbcm_host -lvcos -lvchiq_arm" -o builds/arm5
4. 验证静态库是否存在
在Docker容器中执行以下命令,确认所需静态库已安装:
# 检查zlib静态库 find /usr/arm-linux-gnueabi -name "libz.a" # 检查iconv相关静态库 find /usr/arm-linux-gnueabi -name "libcharset.a" # 检查树莓派硬件库 find /usr/arm-linux-gnueabi -name "libbcm_host.a"
如果找不到对应文件,说明包未正确安装,需要检查apt源或重新安装对应包。
内容的提问来源于stack exchange,提问作者bytecounter
相关产品推荐
相关产品推荐

