交叉编译Go程序至ARM设备时链接自定义libnfc库失败求助
解决Go程序交叉编译ARM时libnfc链接失败问题
问题根源
链接器ld找不到-lnfc是因为当前目录下只有带版本号的库文件libnfc.so.5.0.1,但链接器查找-lxxx时会优先寻找libxxx.so的软链接或文件,同时编译时需要正确设置运行时库搜索路径。
解决步骤
1. 创建符合链接器要求的软链接
在项目目录下执行以下命令,为libnfc库创建标准命名的软链接:
ln -s libnfc.so.5.0.1 libnfc.so.5 ln -s libnfc.so.5 libnfc.so
执行后,目录下会新增两个软链接:
libnfc.so.5->libnfc.so.5.0.1libnfc.so->libnfc.so.5
2. 修改编译脚本build.sh
更新CGO_LDFLAGS,同时指定库搜索路径和运行时库路径:
#!/bin/bash clear export CC=arm-linux-gnueabihf-gcc export CGO_ENABLED=1 export GOOS=linux export GOARCH=arm # -L指定当前目录为库搜索路径,-Wl,-rpath=$ORIGIN设置运行时从程序所在目录找库 export CGO_LDFLAGS="-L$(pwd) -Wl,-rpath=\$ORIGIN -lnfc" go build -ldflags "-s -w"
解释
- 软链接:链接器处理
-lnfc参数时,会自动查找libnfc.so文件,创建软链接后才能让链接器识别到目标库。 -Wl,-rpath=$ORIGIN:告诉链接器,程序运行时会从自身所在目录加载依赖库,确保部署到ARM设备时,只要程序和libnfc库文件在同一目录就能正常运行。- 重新运行
./build.sh即可完成交叉编译。
内容的提问来源于stack exchange,提问作者Mathias Nichele
相关产品推荐
相关产品推荐

