本文首发于公众号【一个老码农】
有大半年没有碰ios的代码了,前段时间有点小需求需要开发,正好借机把Xcode从14.0.1升级到了14.3.1。然后最忧虑的问题终于仍是发生了,项目编译报错,并且是一系列的报错。今天有空记录一下
报错一
报错信息如下:
File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a
查询材料之后发现,是pods
中的库支撑版别过低导致的。需要把pods
库的支撑系统版别改为11.0。
我看了下项目中pods
的第三方库支撑的iOS
版别有的是8.0
的,有的是9.0
的。而项目中app的支撑版别早就改为了11.0
以上。
现在有两种解决方法:
计划一
手动把pods
的targes
里边的第三方库全部改为11.0
,可是比较繁琐,并且履行pod install
时容易再次被掩盖。
计划二
在Podfile
中增加如下脚本,然后履行pod install
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
end
end
end
end
报错二
履行完以上操作后,再次编译,真机编译成功了,可是模拟器编译报错,报错信息如下:
in /path/Pods/WechatOpenSDK/OpenSDK1.8.7.1/libWeChatSDK.a(WechatAuthSDK.o), building for iOS Simulator, but linking in object file built for iOS, file '/path/Pods/WechatOpenSDK/OpenSDK1.8.7.1/libWeChatSDK.a' for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
这个问题是因为曾经的mac
用的是intel
的处理器,intel
处理器是x86_64
架构。而2020年今后苹果的m
系列芯片电脑则运用的是arm64
架构,所以运用新电脑会导致很多老项目代码编译报错。
解决计划:
- 第一步,找到
Build Settings -> Excluded Architectures
,增加一项Any iOS Simulator SDK
,然后将其值设为arm64
- 第二步,将
pod
中的第三方库也设置为扫除模拟器arm64
指令,所以我在Podfile
中的脚本就变成了这样:
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = "arm64"
end
end
end
end
- 履行
pod install
报错三
做完以上操作之后,在archive
打包时我又迎来了第三个报错:
Command PhaseScriptExecution failed with a nonzero exit code
解决计划如下:
计划一
全局查找 source="$(readlink "${source}")"
替换成 source="$(readlink -f "${source}")"
,可是下次再履行pod install
的时分有或许被掩盖
计划二
仍是在Podfile
中填加脚本,然后履行pod install
。脚本如下:
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
shell_script_path = "Pods/Target Support Files/#{target.name}/#{target.name}-frameworks.sh"
if File::exists?(shell_script_path)
shell_script_input_lines = File.readlines(shell_script_path)
shell_script_output_lines = shell_script_input_lines.map { |line| line.sub("source=\"$(readlink \"${source}\")\"", "source=\"$(readlink -f \"${source}\")\"") }
File.open(shell_script_path, 'w') do |f|
shell_script_output_lines.each do |line|
f.write line
end
end
end
end
end
end
脚本兼并
把以上三个脚本兼并,我的Podfile
中的脚本最终变成了这样:
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
# 修改pod的target中的 source="$(readlink "${source}")" 替换成 source="$(readlink -f "${source}")"
shell_script_path = "Pods/Target Support Files/#{target.name}/#{target.name}-frameworks.sh"
if File::exists?(shell_script_path)
shell_script_input_lines = File.readlines(shell_script_path)
shell_script_output_lines = shell_script_input_lines.map { |line| line.sub("source=\"$(readlink \"${source}\")\"", "source=\"$(readlink -f \"${source}\")\"") }
File.open(shell_script_path, 'w') do |f|
shell_script_output_lines.each do |line|
f.write line
end
end
end
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = "arm64"
end
end
end
end
三个脚本兼并后,履行pod install
,然后再履行archive
操作,全部恢复正常
原文地址