Cocoapods:重复的接口定义
Cocoapods: duplicate interface definition
我将我的私有库打包到 CocoaPods 中。它依赖于 ReactiveCocoa。
s.name = 'MineLibrary'
s.dependency 'ReactiveCocoa/Core'
s.source_files = 'Source/*.{h,m,swift}'
....
一些头文件包含:
#import <ReactiveCocoa/RACSignal.h>
我将它包含在一个新项目中:
use_frameworks!
....
pod 'ReactiveCocoa'
pod 'MineLibrary', :git => 'git@.....'
但是当我编译项目时,出现了这个错误:
duplicate interface definition for class 'RACStream'
duplicate interface definition for class 'RACSignal'
/Users/USER/Library/Developer/Xcode/DerivedData/Project-emcwpmbbuimotuftzijeemvngrvj/Build/Products/Debug-iphoneos/Pods/ReactiveCocoa.framework/Headers/RACStream.h:27:1: error: duplicate interface definition for class 'RACStream'
@interface RACStream : NSObject
^
/Users/USER/Workspace/Project/Pods/ReactiveCocoa/ReactiveCocoa/RACStream.h:27:12: note: previous definition is here
@interface RACStream : NSObject
如何解决?
P.S。我正在使用 CocoaPods 0.36.0.rc.1
您是否尝试过更新到最新版本的 CocoaPods?我注意到您提到您使用的是过时的候选发布版,这可能是这里的错误。
一般来说,在您的应用中创建和使用 CocoaPod 时需要执行以下操作:
1) 在您的 CocoaPod 中,在 pod 规范中声明所有依赖项,每个
使用 s.dependency
2) 在您的应用中,使用 CocoaPods 来管理您所有的应用依赖项。也就是说,不要 手动将库拖放到您的应用程序中。如果这样做,您可能会创建重复的 类 与您拖放包含的那些。
3) 在您的应用程序和 CocoaPod 中,尽可能依赖灵活的版本。一般来说,您至少应该允许次要版本更新,例如pod 'PodName', '~> 1.0.0'
.
4) 在您应用的 pod 文件中,为您的应用指定目标和单元测试目标,例如
target "MyApp" do
# App pods...
end
target "MyAppTests", :exclusive => true do
# Test pods...
end
如果您有两个以上的目标,请为每个目标指定一个目标。或者,至少,为单元测试指定一个不同的目标,这将使应用程序注入其中。
我前阵子遇到过这个问题,有人错误地导入了 cocoapod header。确保使用括号表示法,例如而不是:
#import "theUsefulClass.h"
你应该使用:
#import <thePod/theUsefulClass.h>
在Xcode中,您可以检查符号导航器(Cmd-3)以查看符号在哪里定义了两次。这将使您能够决定要做什么。就我而言,我从两个不同的库中找到了两个同名的符号。也许其中之一可以在符号名称中添加前缀以消除冲突。
我将我的私有库打包到 CocoaPods 中。它依赖于 ReactiveCocoa。
s.name = 'MineLibrary'
s.dependency 'ReactiveCocoa/Core'
s.source_files = 'Source/*.{h,m,swift}'
....
一些头文件包含:
#import <ReactiveCocoa/RACSignal.h>
我将它包含在一个新项目中:
use_frameworks!
....
pod 'ReactiveCocoa'
pod 'MineLibrary', :git => 'git@.....'
但是当我编译项目时,出现了这个错误:
duplicate interface definition for class 'RACStream'
duplicate interface definition for class 'RACSignal'
/Users/USER/Library/Developer/Xcode/DerivedData/Project-emcwpmbbuimotuftzijeemvngrvj/Build/Products/Debug-iphoneos/Pods/ReactiveCocoa.framework/Headers/RACStream.h:27:1: error: duplicate interface definition for class 'RACStream'
@interface RACStream : NSObject
^
/Users/USER/Workspace/Project/Pods/ReactiveCocoa/ReactiveCocoa/RACStream.h:27:12: note: previous definition is here
@interface RACStream : NSObject
如何解决?
P.S。我正在使用 CocoaPods 0.36.0.rc.1
您是否尝试过更新到最新版本的 CocoaPods?我注意到您提到您使用的是过时的候选发布版,这可能是这里的错误。
一般来说,在您的应用中创建和使用 CocoaPod 时需要执行以下操作:
1) 在您的 CocoaPod 中,在 pod 规范中声明所有依赖项,每个
使用s.dependency
2) 在您的应用中,使用 CocoaPods 来管理您所有的应用依赖项。也就是说,不要 手动将库拖放到您的应用程序中。如果这样做,您可能会创建重复的 类 与您拖放包含的那些。
3) 在您的应用程序和 CocoaPod 中,尽可能依赖灵活的版本。一般来说,您至少应该允许次要版本更新,例如pod 'PodName', '~> 1.0.0'
.
4) 在您应用的 pod 文件中,为您的应用指定目标和单元测试目标,例如
target "MyApp" do
# App pods...
end
target "MyAppTests", :exclusive => true do
# Test pods...
end
如果您有两个以上的目标,请为每个目标指定一个目标。或者,至少,为单元测试指定一个不同的目标,这将使应用程序注入其中。
我前阵子遇到过这个问题,有人错误地导入了 cocoapod header。确保使用括号表示法,例如而不是:
#import "theUsefulClass.h"
你应该使用:
#import <thePod/theUsefulClass.h>
在Xcode中,您可以检查符号导航器(Cmd-3)以查看符号在哪里定义了两次。这将使您能够决定要做什么。就我而言,我从两个不同的库中找到了两个同名的符号。也许其中之一可以在符号名称中添加前缀以消除冲突。