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

相关推荐
茶底世界之下25 分钟前
类型擦除之后,Metal 滤镜组合为什么不能只执行一个 Filter?
ios·swift
传奇开心果编程3 小时前
【SwiftUI提高练中学】第8课 网络层架构:拦截器、重试、缓存与离线优先
学习·macos·ui·ios·swiftui
传奇开心果编程9 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
tink11 小时前
告别 Xcode IDE:用 VS Code + SweetPad + XcodeGen 开发 iOS 应用的完整指南
ios·swiftui·xcode
传奇开心果编程12 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
黑科技iOS上架14 小时前
iOS隐私合规扫描工具
ios·审核
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer