我试图在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')。这对我来说很有意义,并表明复制头文件可能不是最佳做法。
然而,对于我的项目,我需要两个版本的静态库。实现这一目标的合理方法是什么?
答案 0 :(得分:2)
包含头文件不会自动包含或链接库 - 您可以在Build Phases的“Link Binaries with Libraries”部分中指明您要链接的库。
在您的情况下,您只需要添加所有库,然后使用相应的头文件。
但是,您已经说过这些是同一个库的不同版本。如果您的库包含相同名称的方法,链接器会抱怨它。考虑到这一点,你应该重新考虑是否真的有必要包含同一个库的单独版本 - 如果一个/两个库的问题阻止你只使用一个库,它可能更有用(试图解决这个问题的压力最小化。
答案 1 :(得分:0)
页眉文件不是"链接"任何事情。这是发生了什么。您可以通过标头为一大堆不同的方法创建承诺,然后将该承诺提供给链接器。链接器的一个工作是搜索项目中包含的所有工件,以确保每个方法实际存在。如果缺少一个,您将得到一个丢失的符号错误。如果两个库都定义了具有相同名称的方法,则会出现重复的符号错误。最后,那些.a文件不存在。所有内容都放在一个二进制文件中。