Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在XCode中使用静态库时必须将二进制文件与库链接两次_Objective C_Xcode_Static Libraries_Static Linking_Xcode4.4 - Fatal编程技术网

Objective c 在XCode中使用静态库时必须将二进制文件与库链接两次

Objective c 在XCode中使用静态库时必须将二进制文件与库链接两次,objective-c,xcode,static-libraries,static-linking,xcode4.4,Objective C,Xcode,Static Libraries,Static Linking,Xcode4.4,我试图在项目中使用静态库。静态库依赖于几个框架。。。CoreData、CFNetwork、通讯录等 静态库也使用类别,因此我不得不在主项目的“其他链接器设置”中使用-all_load linker选项。当我启用此功能时,我得到120个错误,所有这些错误都与我的主项目没有与我的静态库(CoreData、CFNetwork、AddressBook等)相同的框架链接有关 开发人员想要使用静态库,链接到它,但仍然需要链接到库链接到的所有框架,这是非常不方便的。有没有办法自动化这个过程,使主项目自动链接到

我试图在项目中使用静态库。静态库依赖于几个框架。。。CoreData、CFNetwork、通讯录等

静态库也使用类别,因此我不得不在主项目的“其他链接器设置”中使用-all_load linker选项。当我启用此功能时,我得到120个错误,所有这些错误都与我的主项目没有与我的静态库(CoreData、CFNetwork、AddressBook等)相同的框架链接有关

开发人员想要使用静态库,链接到它,但仍然需要链接到库链接到的所有框架,这是非常不方便的。有没有办法自动化这个过程,使主项目自动链接到静态库链接到的所有框架

我使用的是XCode 4.4

编辑:为了更清楚,我有以下内容:

StaticLibrary.xcodeproj
    - AFNetworking
        - files...
    - CoreData
        - categories for NSManagedObjectContext, for convenience
    - AddressBook
        - convenience methods for working with contacts
该项目的目标链接到构建阶段>链接二进制与库下的必要框架。这包括CoreData.framework、AddressBook.framework等

现在我想做的是将这个库添加到我的另一个项目中。事实上,我想将这个库添加到我从现在开始所做的每个新项目中,这样我就可以轻松访问我所编写的便利函数/类别。因此:我将库添加到我的项目中,然后添加
.a
文件以构建阶段>将二进制文件链接到库(我的主项目)。我还做我所知道的所有其他必要的事情(见评论)

我希望发生的事情:主项目现在链接到库,因此它继承了库的所有链接,因此主项目现在也链接到CoreData.framework、AddressBook.framework等

发生了什么:主项目给了我错误,因为它没有链接到库所需的任何东西


有没有办法自动将链接的框架从静态库添加到主项目中,或者我应该将库拆分为CoreDataStaticLibrary等,然后要求开发人员每次都将CoreData.framework以及静态库添加到项目目标中?

,如果您的库只包含类别,则只需要
-all\u load
。否则,您可以使用
-ObjC
。无论如何,这就是我所用的

此外,在构建静态库时,您只需创建已编译对象模块的存档。库中未解析任何外部依赖项。实际上,您应该把它看作是一组目标代码文件的单个集合

因此,当您最终链接可执行文件时,它将链接所有已编译代码,以及静态库中预编译代码的存档。链接器希望解析所有符号,因此您必须告诉它在哪里可以找到完全解析所有符号所需的所有库(框架)

XCode是否应该能够查看静态库子项目的内部,并从该项目中提取框架依赖项,并将它们添加到最终项目的链接器调用中?当然但是,我不知道有什么方法可以自动做到这一点


如果需要,您可以为库创建一个podfile,并使用来管理项目依赖项。

据我所知,如果库只包含类别,您应该只需要
-all\u load
。否则,您可以使用
-ObjC
。无论如何,这就是我所用的

此外,在构建静态库时,您只需创建已编译对象模块的存档。库中未解析任何外部依赖项。实际上,您应该把它看作是一组目标代码文件的单个集合

因此,当您最终链接可执行文件时,它将链接所有已编译代码,以及静态库中预编译代码的存档。链接器希望解析所有符号,因此您必须告诉它在哪里可以找到完全解析所有符号所需的所有库(框架)

XCode是否应该能够查看静态库子项目的内部,并从该项目中提取框架依赖项,并将它们添加到最终项目的链接器调用中?当然但是,我不知道有什么方法可以自动做到这一点


如果需要,可以为库创建一个podfile,并使用来管理项目依赖关系。

问题是您多次包含相同的符号。我已经多次遇到相同的问题,解决方案基本上是理解“-all_load”标志的作用,这在这个问题中得到了很好的解释:

尽管如此,您从未以这种方式引用库中的框架。由于这些框架是动态链接的,它们并不真正属于您的静态库,所以其中只有指向它们的引用

此类库的用户应负责添加必要的框架,以使其正常工作。这意味着,您不必将库链接到这样的框架(因为这样的东西毫无意义),只需将它们添加到将要使用它的项目中即可。(查看Restkit以了解它是如何完成的)

此外,我认为您可以去掉“all_load”标志,并尝试用“force_load/path/to/the/library”替换它。只有在库只包含类别(根本没有类)的情况下,才需要all_load


让我们知道它的进展和快乐的编码

问题是您多次包含相同的符号。我已经多次遇到相同的问题,解决方案基本上是理解“-all_load”标志的作用,这在这个问题中得到了很好的解释:

尽管如此,您从未以这种方式引用库中的框架。由于这些框架是动态链接的,它们实际上不属于静态库,所以只有引用