Xcode:静态库的多个版本

时间:2014-10-07 07:11:31

标签: ios objective-c xcode static-libraries

我试图在Xcode(6.0.1)中创建一个使用两个版本的静态库的项目。因此,我创建了一个类似于此的目录结构:

+ include
  |-- VersionA
      |-- foo.h
      |-- bar.h
  |-- VersionB
      |-- foo.h
      |-- bar.h

+ lib
  |-- VersionA
      |-- foo.a
      |-- bar.a
  |-- VersionB
      |-- foo.a
      |-- bar.a

两个目录中的头文件foo.h和bar.h是相似的,而可执行文件是不同的。为了包含某个标题,我(非递归地)将include目录添加到搜索路径中,如下所示:

#include "VersionA/foo.h"   // or this:
#include "VersionB/bar.h"

现在的问题是:Xcode如何确定链接某个头文件的Mach-O fat(.a)文件?这项任务如何运作,我该如何影响呢?

编辑:

我没有重复的符号链接错误,尽管链接器会查看两个lib目录。由于头文件包含像

这样的警卫
#ifndef FOO_H
#define FOO_H
...

我也没有关于重新定义的错误。如果我改变一个包括警卫,即

#ifndef FOO_H_VERSION1

编译时出现错误(Sematic Issue,重新定义' FOO_SOMETHING')。这对我来说很有意义,并表明复制头文件可能不是最佳做法。

然而,对于我的项目,我需要两个版本的静态库。实现这一目标的合理方法是什么?

2 个答案:

答案 0 :(得分:2)

包含头文件不会自动包含或链接库 - 您可以在Build Phases的“Link Binaries with Libraries”部分中指明您要链接的库。

在您的情况下,您只需要添加所有库,然后使用相应的头文件。

但是,您已经说过这些是同一个库的不同版本。如果您的库包含相同名称的方法,链接器会抱怨它。考虑到这一点,你应该重新考虑是否真的有必要包含同一个库的单独版本 - 如果一个/两个库的问题阻止你只使用一个库,它可能更有用(试图解决这个问题的压力最小化。

答案 1 :(得分:0)

页眉文件不是"链接"任何事情。这是发生了什么。您可以通过标头为一大堆不同的方法创建承诺,然后将该承诺提供给链接器。链接器的一个工作是搜索项目中包含的所有工件,以确保每个方法实际存在。如果缺少一个,您将得到一个丢失的符号错误。如果两个库都定义了具有相同名称的方法,则会出现重复的符号错误。最后,那些.a文件不存在。所有内容都放在一个二进制文件中。