Xcode:静态库的多个版本



我正试图在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如下:

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

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

编辑:

虽然链接器同时查看两个lib目录,但我没有得到重复的符号链接错误。由于头文件包含类似的保护程序

#ifndef FOO_H
#define FOO_H
...

关于重新定义,我也没有任何错误。如果我更改一个包括防护装置,即

#如果FOO_H_VERSION1

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

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

包含头文件不会自动包含或链接库-您可以在构建阶段的"将二进制文件与库链接"部分指示要链接的库。

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

然而,您已经说过,这些是同一个库的不同版本。如果您的库包含相同名称的方法,则链接器会抱怨这一点。考虑到这一点,你应该重新考虑是否有必要包含同一个库的不同版本——如果其中一个/两个库出现问题,导致你无法只使用一个库,那么尝试解决这个问题可能会更有用(最终压力会更小)。

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

相关内容

最新更新