0%

go升级到1.21版本gomobile编译报错:Undefined symbols

前言

之前把gopeed项目升级到go1.21版本后,发现gomobile编译完后,在 flutter ios 端编译会报错,如下:

1
2
3
4
5
6
7
8
9
ld: Undefined symbols:
_res_9_nclose, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
_res_9_ninit, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
_res_9_nsearch, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
clang: error: linker command failed with exit code 1 (use -v to see invocation)

然后我在gogithub里找到了这个issue,但是看到这个@bcmills哥们的回复感觉太麻烦了就用了后面@dreacot老哥的解决方案,编译的时候加上-tags netgo

1
gomobile bind -target=ios -tags netgo

然后就可以正常编译了,因为我自己没有ios设备,就没有测试过,按理说编译通过了应该就没问题了,然而最近 github 上好多用户都在反馈 ios 端无法正常使用,附上一个issue,看起来都是DNS解析的问题,起初以为是用户的网络问题,但是随着越来越多的用户反馈,这肯定就不是单纯的用个例问题了,于是又重新开始研究@bcmills哥们的解决方案。

添加 libresolv.tbd 库

他提到的解决方案是通过添加libresolv.tbd或者libresolv.9.tbd库来解决,但是很尴尬的是我没有mac设备,所以没办法在 xcode 里添加这个库,于是问了下无所不知的ChatGPT,看看能不能通过命令行添加这个库:

看起来好像可行,在github action中跑了下,然后顺便把生成出来的project.pbxproj文件打印出来,如果没问题的话就复制出来提交,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gem install xcodeproj
cat <<EOF > temp.rb
require 'xcodeproj'
project_path = 'ui/flutter/ios/Runner.xcodeproj'
project = Xcodeproj::Project.open(project_path)
target = project.targets.first

# 添加系统库
lib_name = 'libresolv.tbd'
framework = 'usr/lib/' + lib_name
target.frameworks_build_phase.add_file_reference(project.frameworks_group.new_file(framework))

project.save
EOF
ruby temp.rb

echo "==========edit project.pbxproj============"
cat ui/flutter/ios/Runner.xcodeproj/project.pbxproj
echo "==========edit project.pbxproj============"

接着就是等待github action的结果了,结果是编译成功的,然后把IPA包发给用户测试,一切正常,问题解决,最后把更新之后的project.pbxproj文件提交到github上,至此一个没有mac设备的我就这样把这个问题解决了,哈哈,不得不说我可真是个天才(狗头保命)。


我是MonkeyWie,欢迎扫码👇👇关注!不定期在公众号中分享JAVAGolang前端dockerk8s等干货知识。

如果觉得本文对您有帮助,可以请我喝一杯咖啡☕