2012-07-31 206 views
12

我目前有一个非常大的代码库的单个Xcode项目,我将其称为项目X,我将其分成一堆子项目(项目A ,B,C)。链接静态库,共享另一个静态库

到目前为止,这些项目中的每一个都自行编译就好了。他们都产生静态库。 项目B项目C依赖于生成的静态库项目A为了构建。

我有另外一个xcode项目,项目ž,需要通过项目B和C产生的静态库。这就是问题所在。当项目Z进入链接器阶段时,事情就会爆炸 - 对于项目B和C,它们原先链接的代码在项目A中找到重复的符号!

我是很新,静态库的世界,我不能确定如何与项目ž前进,或如何修改其他项目,使他们链接对同一A计划 lib。我有一种感觉,这是不可能的。我在这里有什么选择?

编辑:

我要澄清的是项目B项目C需要建设成单独的静态库,因为某些客户端将只需要一个或另一个。

另外,我在OSX和iOS平台上都遇到了这个困境。

我意识到我可以通过将项目构建为动态库来解决OSX上的这个问题。不过,我宁愿不这样做,它仍然让我在iOS上遇到同样的问题。

回答

16

静态库不应该包含其他静态库(或通常的第三方代码)。一个静态库只是一堆粘在一起的.o文件。所以如果你有相同信息的多个副本,它会炸毁。

每个静态库应该只有它自己的代码。最终的应用程序负责将所有必需的库链接在一起(包括库所需的库)。通过这种方式,每件事物都有一个链接。

+1

是的,你说得对。 我解决了这个问题,只是没有将项目B和项目C链接到项目A.项目B和C仍将项目A作为依赖项引用,因此它们能够很好地构建。由于客户将始终将项目A与这些项目并列在一起,因此所有符号都可以找到并且工作起来。 – Jeff 2012-08-01 19:28:19

+0

@Jeff你是如何使A成为“依赖”的,这样其他人可以构建,而不是实际连接到(包括)A的构建中? – johnbakers 2016-04-30 13:39:24

+1

@Rob我注意到,在Xcode中,如果我构建的静态库仅包含到另一个库的头,但没有链接到其他库的二进制文件,则构建完成。如果我用一个实际的程序项目(而不是一个库)来做这件事,那么在链接阶段有一些未定义的定义(错误)。我假设当你建立一个图书馆时,“跳过”链接阶段的这部分是正常的,而实际的程序在建立时会做额外的链接检查,是吗? (如果它被指示构建一个库,编译器实际上会做什么?) – johnbakers 2016-04-30 14:38:45

2

这听起来像是CoacoaPods被创建来解决的问题。如果您为每个项目定义窗格,则Z应该能够确定并链接所有的依赖关系,而不会引入重复的符号。