Xcode升级14.3.1版本报错问题

本文首发于公众号【一个老码农】

有大半年没有碰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

arduino 复制代码
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架构,所以使用新电脑会导致很多老项目代码编译报错。

解决方案:

  1. 第一步,找到Build Settings -> Excluded Architectures,添加一项Any iOS Simulator SDK,然后将其值设为arm64
  2. 第二步,将pod中的第三方库也设置为排除模拟器arm64指令,所以我在Podfile中的脚本就变成了这样:
arduino 复制代码
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
  1. 执行pod install

报错三

做完以上操作之后,在archive打包时我又迎来了第三个报错:

Command PhaseScriptExecution failed with a nonzero exit code

解决方案如下:

方案一

全局搜索 source="$(readlink "${source}")" 替换成 source="$(readlink -f "${source}")",但是下次再执行pod install的时候有可能被覆盖

方案二

还是在Podfile中填加脚本,然后执行pod install。脚本如下:

arduino 复制代码
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中的脚本最终变成了这样:

arduino 复制代码
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 操作,一切恢复正常

相关推荐
Liben3 小时前
Weex开发踩坑记录
android·前端·ios
season_zhu4 小时前
Skills For Real Engineers 系列之三:需求聊清楚了,怎么一步步走主流程,做到交付?
ios·ai编程
茶底世界之下5 小时前
窗边花瓶太暗?用 Awaking 看提亮室内的代价
ios
2501_915909066 小时前
Windows 上用 VS Code 调试 iPhone 真机 App,KXBuild 断点、崩溃定位实操
ide·windows·vscode·ios·iphone·个人开发·敏捷流程
2501_9160074721 小时前
抓包工具功能对比,TraceEagle、Charles、Fiddler、Wireshark、mitmproxy 差别
前端·网络协议·ios·adb·https·fiddler·wireshark
2501_915106321 天前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
柚鸥ASO优化1 天前
iOS 27.2 更新后,App Store 广告展示逻辑出现新变化
ios
美狐美颜SDK开放平台1 天前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
茶底世界之下1 天前
秋叶已经够黄了:用 Awaking 单独收一点黄色
ios
Jewel1051 天前
文字为什么总是不居中!记录一个bug
android·flutter·ios