我正试图在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文件不存在了。所有内容都放在一个二进制文件中。