# go升级到1.21版本gomobile编译报错:Undefined symbols
文章目录
前言
之前把gopeed项目升级到go1.21版本后,发现gomobile编译完后,在 flutter ios 端编译会报错,如下:
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)然后我在go的github里找到了这个issue,但是看到这个@bcmills哥们的回复感觉太麻烦了就用了后面@dreacot老哥的解决方案,编译的时候加上-tags netgo:
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文件打印出来,如果没问题的话就复制出来提交,脚本如下:
gem install xcodeprojcat <<EOF > temp.rbrequire '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_nametarget.frameworks_build_phase.add_file_reference(project.frameworks_group.new_file(framework))
project.saveEOFruby temp.rb
echo "==========edit project.pbxproj============"cat ui/flutter/ios/Runner.xcodeproj/project.pbxprojecho "==========edit project.pbxproj============"接着就是等待github action的结果了,结果是编译成功的,然后把IPA包发给用户测试,一切正常,问题解决,最后把更新之后的project.pbxproj文件提交到github上,至此一个没有mac设备的我就这样把这个问题解决了,哈哈,不得不说我可真是个天才(狗头保命)。