Xcode 14下Flurry类重复实现问题求助
问题描述
我当前在Xcode 14中编译App的Podfile如下:
source 'git@github.com:Internal/PrivatePodspecs.git' source 'https://github.com/CocoaPods/Specs.git' platform :ios, '13.0' project 'Project.xcodeproj' def shared pod 'MBProgressHUD', '1.1.0', :inhibit_warnings => true pod 'Crashlytics', '3.14.0', :inhibit_warnings => true pod 'TTTAttributedLabel', '2.0.0', :inhibit_warnings => true pod 'Flurry-iOS-SDK/FlurrySDK' pod 'PhoneNumberKit', '2.6.0', :inhibit_warnings => true pod 'Firebase/Analytics', '6.2.0', :inhibit_warnings => true pod 'CardScan', '1.0.5040', :inhibit_warnings => true # Internal Dependencies pod 'InternalLibA' pod 'InternalLibB' pod 'InternalLibC' pod 'InternalLibD' pod 'InternalLibE' pod 'InternalLibF' target 'Project' do # Comment this line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {} end # Pods for Project shared deployment_target = '13.0' post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES' config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = deployment_target end end end
编译时编译器抛出多个错误,提示多个Flurry类(如FlurryPLCrashReportSystemInfo、FlurryStreamCrashReporter等)同时在内部库和App中实现,导致Flurry无法与后端通信。测试发现将相关库改为静态库可消除重复实现错误,但其中一个库静态链接时会崩溃,求其他可行解决方案。
可行解决方案
1. 统一Flurry依赖的引入方式
- 检查内部库(InternalLibA-F)的Pod配置,确保只有主App target引入Flurry-iOS-SDK,内部库不再单独依赖Flurry。如果内部库需要调用Flurry的API,通过主App传递实例或者使用协议抽象,避免直接引入依赖。
- 如果内部库必须依赖Flurry,修改内部库的podspec,将Flurry设为
weak_framework或者dependency但标记为:optional,确保编译时不会重复链接符号。
2. 使用CocoaPods模块化头文件配置
- 在主target下添加
use_modular_headers!,让所有Pods生成模块化头文件,避免符号冲突:target 'Project' do use_frameworks! use_modular_headers! # 添加这一行 # ...其他配置 end - 或者针对单个Pod启用模块化头文件,仅给Flurry设置:
pod 'Flurry-iOS-SDK/FlurrySDK', :modular_headers => true
3. 调整Flurry的链接属性
- 在post_install钩子中,给Flurry相关target强制设置动态库属性,并允许非模块化头文件引入:
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES' config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = deployment_target # 针对Flurry target单独配置 if target.name.start_with?('Flurry') config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES' config.build_settings['MACH_O_TYPE'] = 'mh_dylib' # 强制动态库类型 end end end end
4. 通过链接器参数忽略重复符号
- 在主App的Build Settings中,找到
Other Linker Flags,添加-weak-l参数处理Flurry的重复符号:
该参数会让链接器忽略重复定义的符号,优先使用主App中的实现。-weak-lFlurry-iOS-SDK
5. 升级Flurry SDK版本
- 当前使用的Flurry版本可能存在符号暴露问题,尝试升级到最新稳定版,新版本通常会优化符号封装逻辑,降低冲突概率。
内容的提问来源于stack exchange,提问作者thesuffering
相关产品推荐
相关产品推荐

