什么是正确的过程链接静态库有共同的静态库?

我正在使用一个名为Silicon的静态库,用于我的所有iOS应用程序。

因为我不想创build一个庞大的静态库,可能会变得很难维护,所以我创build了很多更小的静态库,作为子模块附加。

截至本文撰写之时,Silicon的依赖关系树如下:


|
| ==> FDKeychain
| FDDataClient
|
| => FDRequestClient
|
| => FDFoundationKit
| ==> FDSQLiteDatabase
|
| => FDFoundationKit

正如你所看到的,FDRequestClient和FDSQLiteDatabase都将FDFoundationKit作为一个通用的静态库。

看来发生的事情是,当一个使用Silicon的项目build成时,它将所有的Silicon的目标依赖关系build立到项目构build目录中。 FDDataClient和FDSQLiteDatabase发生同样的事情。 所以在某些时候,FDRequestClient的FDFoundationKit被构build并复制到构build目录以及来自FDSQLiteDatabase的FDFoundationKit。 无论哪一个最后修build的只是覆盖前一个。

仅仅靠运气FDFoundationKit并没有以任何严肃的方式改变,FDRequestClient和FDSQLiteDatabase不能总是使用相同的版本,但我不能保证它永远是这样的。

我想知道是否有一种方法可以指定FDFoundationKit使用哪个版本,所以它可以是Silicon的责任,以确保所使用的版本将适用于FDRequestClient,FDSQLiteDatabase和我将来添加的任何其他依赖项。

我知道CocoaPods试图解决这个问题,但我不想让别人设置所有这些只是为了让我的图书馆工作。 如果我能find硅定义哪个版本的FDFoundationKit使用一切将完美的工作。

你可以(和我们一样)将所有库放到框架中,因为框架支持版本控制。 框架只是一个通用的方式configuration的目录树。 Xcode不直接支持框架的创build,所以你必须在脚本中创build它们,通常是最后的构build阶段。 一个例子(感谢jverkoey )可以在IOS框架中find

在一个框架内,你可以存储每个静态库的所有版本

 myLibrary.framework->Versions->nn folders. 

myLibary.framework->Versions->Current是到最新版本的文件夹的链接。

由于你使用的是静态库,硅本身不能指定版本(这将需要dynamic库),但是用于构build硅的构build,链接器或环境标志当然可以。

通过这种方式,默认情况下,应用程序将始终使用该库的最新版本,但构build时链接器的标志可轻松覆盖实际版本的链接。 另外,所有的用户都会像其他框架一样将Silicon框架包含在他们的项目中,所以对于开发人员来说非常简单。

看来这个问题只有两个答案:

1)使用像CocoaPods或Carthage这样的依赖pipe理器。

2)你发布的任何静态库或框架不应该有任何目标依赖。 他们应该链接你有任何依赖关系,这是你的图书馆整合所需的依赖关系的人的责任。