如何删除通过 cocoa pods 在 iOS 中生成的重复文件

How to remove duplicate files generated through cocoa pods in iOS

我正在使用 cocoa pods 将多个第三方文件集成到我的项目中。

我必须将下面的 pod 集成到我的项目中

xcodeproj 'MyApp'
workspace 'MyApp'

source 'https://github.com/CocoaPods/Specs.git'

target :"MyApp", :exclusive => true do

  platform :ios, '7.0'

  pod 'AFNetworking', '2.0.2'

  pod 'TwilioSDK', '~>1.2.2'

  pod 'SocketRocket', '0.3.1-beta2'

  pod 'AppRTC'

end

当我 运行 pod 安装时。我得到如下所示的重复项..

当我构建我的应用程序时出现错误

ld: warning: directory not found for option '-L/Users/anand/Documents/
  Project/myApp_Backups/myApp_June/myApp_WEBRTC/Pods/build/Debug-
  iphoneos'
duplicate symbol _MD5_Update in:
    /Users/anand/Documents/Project/myApp_Backups/myApp_June/
  myApp_WEBRTC/Pods/AppRTC/Lib/libWebRTC.a(nss_static.md5.o)
    /Users/anand/Documents/Project/myApp_Backups/myApp_June/
  myApp_WEBRTC/Pods/TwilioSDK/Libraries/libcrypto.a(md5_dgst.o)
duplicate symbol _SHA1_Update in:

duplicate symbol _OBJC_IVAR_$_SRIOConsumer._readToCurrentFrame in:
    /Users/anand/Library/Developer/Xcode/DerivedData/myApp-
  gxdbyoohznnpigavdqmaeilzlavd/Build/Products/Debug-iphoneos/libPods-
  myApp-SocketRocket.a(SRWebSocket.o)
    /Users/anand/Documents/Project/myApp_Backups/myApp_June/
  myApp_WEBRTC/Pods/AppRTC/Lib/libWebRTC.a(socketrocket.SRWebSocket.o)

ld: 71 duplicate symbols for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我想做以下解决方案:

1) 删除 SRWebSocket.h 文件 -- 但它可能会出错,因为它在 Pods.

2) 从 pod 文件中删除 pod 'SocketRocket', '0.3.1-beta2' 并安装 运行 pod -- 但我同时使用了 SRWebSocket.h 和 SRWebSocket.m在将 AppRTC 安装到我的项目之前在我的项目中..!

请建议我如何解决这个问题..

提前致谢..!

在您的构建阶段,检查您是否没有多次编译同一个文件。

在你的情况下,编译源中可能有两个相同的 m 文件,只需删除一个并尝试重建。

按照以下步骤解决重复符号错误。

1) Select your Xcode Project > Navigate to "Build Phases".

2) From there, search the file name for which you are getting duplication.

3) If possible, then there might be more than one ".m files" for your search keyword.

4) Remove all the files except one which you need to actually compile.

5) Same way follow the process for all the duplicate error

6) That's it! Your problem will be solved for sure.

为 AppRTC 存储库创建一个问题以删除 header 并设置对 SRWebSocket 的依赖。 作为临时解决方案 - link AppRTC 使用 :path 指令到本地路径并从本地目录中删除此文件。或者您可以 link 在 exclude_files 配置中对 SRWebSocket header 无知的本地 podspec 文件。

解决方案

  • 备份你的项目
  • 关闭Xcode
- 在终端上安装这个 gem:

https://github.com/kylef/cocoapods-deintegrate

  • 运行 下面的命令行:

    pod deintegrate

  • 删除项目目录中的 Podfile.lock 文件

  • 运行 重新安装:

    pod install

  • 打开 Xcode 并清理您的项目,然后 然后再次 运行

希望此解决方案能解决您的问题。

最佳

我已经解决了上面的问题如下

在我的 Xcode 项目中 -- 构建设置 -- 其他链接器标志 -- 我删除了 -all_load 然后一些重复的错误消失了。

采用上述解决方案后,我仍然收到 Socket Rocket 重复警告。

我通过转至 Pods 项目 -- 选定的 Socket Rocket pods 目标 -- 从编译中删除了 SRWebSocket.m 文件来修复此问题。它工作正常,重复项已被删除。

谢谢大家的回答..

您需要从 libWebRTC.a

中删除 socketrocket 对象代码

运行 lipo -info libWebRTC.a 查看库中有哪些架构(当前版本为 i386、armv7 和 arm64)

然后运行

lipo libWebRTC.a -thin i386 -output libWebRTC-i386.a

通过将 i386 替换为相关值,为每个体系结构执行此操作。然后您需要从每个存档中提取目标文件。

mkdir libWebRTC-i386 && cd libWebRTC-i386 && ar -x ../libWebRTC-i386.a

为您刚刚创建的每个新的单一体系结构库执行此操作。在每个新文件夹中,您会发现包含 "socketrocket" 的 .o 文件 - 删除这些文件。

然后重新归档每个体系结构的目标文件

libtool -static *.o -o ../libWebRTC-i386.a

完成后将它们重新组合成一个胖库

lipo -create libWebRTC-armv7.a libWebRTC-arm64.a libWebRTC-i386.a -output libWebRTC.a

瞧,它现在应该可以工作了。 libWebRTC.a 二进制文件确实需要在没有 socket rocket 对象代码的情况下重新构建,并且 socket rocket 应该作为 podspec 的依赖项添加。

现在可以非常轻松地删除重复的 pod 文件或任何未用于您的项目的 pod。

  1. 打开您的 pod 文件。
  2. 评论您要删除的所有 pod 文件。

  3. 使用推荐pod install

  4. 你会在终端

  5. 中删除你的所有评论窗格

Enjoy your day with a cup of tea or coffee while doing code.