因为我没有找到原始问题的答案(即,公开了通过CocoaPods加载的依赖项的标头),我觉得我不应该为自己的问题发布答案。但是,我确实找到了解决我的特定问题的解决方案,该解决方案可以解决暴露标题的问题。
[在我的问题中,我试图使用Objective Sharpie为我的框架创建Xamarin绑定。我的框架公开了一个扩展JSONModel的类,因此需要JSONModel头文件才能构建这些绑定。
通过阅读Objective Sharpie文档,我发现Clang有一个“ framework directory”命令行参数,它告诉它要在哪个目录中查找项目引用的框架。
我只是将JSONModel.framework
和myframework.framework
放在同一目录中,然后当我运行Objective Sharpie时,就这样运行它:
sharpie bind -sdk ios myframework.framework/Headers/myframework.h -c -F .
这成功创建了绑定。
我确实遇到了一个小的挫败感。我可以使用Objective Sharpie的-scope
命令行参数,它将输出大约1800行的文件,仅包含我自己的类的绑定。但是,该文件NOT包含JSONModel的定义,并且在我的Xamarin项目中不起作用。如果我不使用-scope
参数,它将为everything(包括所有Foundation)创建绑定。这创建了大约84000行文件。
要解决此问题,我将JSONModel绑定从84000线文件手动复制到1800线文件,并且效果很好。
我有一个用Objective-C编写的框架。该框架具有3个依赖项(即CocoaLumberjack
,Google-IMA-iOS-SDK
和JSONModel
)
在我的框架内,我有一个如下定义的公共类:
Broadcast.h
#import <JSONModel/JSONModel.h>
@interface Broadcast : JSONModel
@property (nonatomic) NSString *title;
@proeprty (nonatomic) NSString *url;
@end
当我构建框架时,它就可以正常工作。当我将框架导入到Objective-C项目(并包括JSONModel框架,因为它是一个依赖项)时,它就可以正常工作。当我使用CocoaPods安装框架时,它就可以正常工作。
当我尝试使用Objective Sharpie为我的框架创建C#绑定(用于Xamarin)时,出现了问题>
当我跑步时:
sharpie bind -sdk ios myframework.framework/Headers/myframework.h
我收到错误:
Cannot find JSONModel.h
特别是它正在寻找JSONModel.h inin
我的框架。对于CocoaLumberjack或Google IMA SDK而言,这不是问题,因为它们严格是实现细节,并且我的公共标头都没有引用它们。但是,当涉及到JSONModel时,其接口实际上是我的公共API的一部分。是否可以在输出Headers
目录中放置JSONModel.h(和所有其他JSONModel标头)的副本?或者,否则,可以通过某种方式告诉Objective Sharpie在多个框架中查找绑定?
快速更新,在过去的一个小时中,我一直在继续对此进行讨论。通过告诉Clang在哪里可以找到 Broadcast.hJSONModel.h
并进行代码调整,我能够使Objective Sharpie达到至少运行#import <JSONModel.h> // <-----
@interface Broadcast : JSONModel
@property (nonatomic) NSString *title;
@proeprty (nonatomic) NSString *url;
@end
然后在运行Objective Sharpie时:
sharpie bind -sdk ios -scope myframework.framework/Headers myframework.framework/Headers/myframework.h -c -IJSONModel.framework/Headers
这工作得更好,但是遇到了一个问题,只给了我一个问题:
typeof(JSONModel)
,该位置未定义并且引发错误。我可以通过删除-scope
参数来解决此问题,但这将创建一个长度为84000行而长度为1800行的绑定文件,并且包含诸如AFNetworking,AVPlayer等之类的绑定。<JSONModel/JSONModel.h>
的原因既是因为这是我一直看到导入的CocoaPods依赖项的方式,也是因为自动完成功能推荐了它。那么,为什么导入<JSONModel.h>
同样有效?将来会不会破坏某些东西?为了更正作用域问题而不生成84000线绑定文件,我也尝试使用像.
或"$(pwd)"
这样的作用域,但没有任何效果。它要么创建了一个1800行文件,没有为JSONModel定义,要么创建了一个84000行文件,其中有everything
虽然我仍然不完全欣赏<JSONModel/JSONModel.h>
和<JSONModel.h>
之间的区别,但我确实学到了一些东西:
.framework
文件<JSONModel/JSONModel.h>
可以工作<JSONModel.h>
可以工作以便解决该问题
回答我的问题:因为我没有找到原始问题的答案(即,公开了通过CocoaPods加载的依赖项的标头),所以我不认为应该为自己的问题发布答案...
<X/X.h>
与<X.h>
Clang具有“ frameworks”的内置概念(您可以使用-F
标志指定框架搜索目录)。当您使用<X/*>
导入语法时,Clang将搜索名为X
的框架。 CocoaPods通过使用此-F
标志来引用导入的依赖项,因此您必须