如何构建一个 Objective-C 静态库以作为单个二进制文件和头文件分发?

Pra*_*ogg 5 linker header objective-c static-libraries ios

我正在MyLibrary为 Objective-C 中的 iOS构建一个静态库,它将十几个有用的类捆绑在一起,每个类都有自己的 .h 文件。我想MyLibrary作为单个编译的二进制libMyLibrary.a文件 和单个 .h 头文件分发MyLibraryAPI.hMyLibraryAPI.h有十几个#import语句,每个MyLibrary公共类都有一个。希望包含MyLibrary在其宿主项目中的开发人员只需包含libMyLibrary.a二进制文件和MyLibraryAPI.h标题。这就是目标。

因此,我已将Xcode 项目Role中每个公共类的设置MyLibraryPubliclibMyLibrary.a使用 Xcode 命令行构建工具和lipo. 然后,我手动将所有十几MyLibrary个头文件包含libMyLibrary.a在一个宿主项目中,宿主项目可以MyLibrary毫无问题地使用公共类。惊人的!

问题是,如果我删除那些十几头文件和使用MyLibraryAPI.h,而不是(这是我的目标),主体项目的类不能再找到MyLibrary中引用的头文件MyLibraryAPI.h。相反,在编译时,我收到如下错误:MyAwesomeThingDelegate.h: No such file or directory...对于MyLibrary我尝试#importMyLibraryAPI.h. 我在我的宿主项目根目录中有一个文件夹,lib在宿主项目构建设置中将递归头搜索路径设置为lib/**和在库搜索路径中,将递归路径设置为lib/**.

我很想听听社区关于如何正确设置宿主项目的搜索路径的建议,以便我只需要包含libMyLibrary.aMyLibraryAPI.h使用这些MyLibrary类。或者,如果我做错了什么,我很想听听另一个建议,以实现我分发单个二进制文件和单个 API 头文件的目标。

Cod*_*odo 1

我遇到了同样的挑战,并提出了以下解决方案:

首先,我尝试隐藏尽可能多的实现细节。因此,我通常构建一对类:一个类是公共接口,另一个类是私有实现。公共类只有一个成员实例:指向实现的指针。私有类只有一个前向声明。

@class MyViewImpl;

@interface MyView : UIView
{
    @private
    MyViewImpl* _internal;
}

@property (nonatomic, assign) CGRect highlightArea;
- (void) startAnimation;

@end
Run Code Online (Sandbox Code Playgroud)

其次,我将所有公共声明放入一个头文件中。它使用起来就像使用单独的头文件一样舒适,但它确实有效。剩下的唯一导入是 iOS 内容的导入,例如:

#import <UIKit/UIKit.h>
Run Code Online (Sandbox Code Playgroud)