Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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
Ios 如何编译具有第三方依赖项而不包含依赖项的静态库?_Ios_Objective C_Xcode_Cocoa Touch_Static Libraries - Fatal编程技术网

Ios 如何编译具有第三方依赖项而不包含依赖项的静态库?

Ios 如何编译具有第三方依赖项而不包含依赖项的静态库?,ios,objective-c,xcode,cocoa-touch,static-libraries,Ios,Objective C,Xcode,Cocoa Touch,Static Libraries,TL;博士 如何构建静态库而不包含我正在引用的第三方库 嗨 在开始之前,我知道如何在针对iOS设备和模拟器的Xcode中编译静态库。但是,这一次我依赖于第三方库,我不想将其包含在静态库中。我只是想引用它。但是,每当我构建静态库时,就会出现词法或预处理器错误,我知道当库从项目中丢失时,这是很常见的。发生错误的原因是我从项目中删除了库,因为我不想将它内置到静态库中 有问题的图书馆正在建立网络。在安装静态库时,我将使用cocoapod显式安装依赖项 谢谢。您可以将lib.a和lib.h添加到您的

TL;博士

  • 如何构建静态库而不包含我正在引用的第三方库

在开始之前,我知道如何在针对iOS设备和模拟器的Xcode中编译静态库。但是,这一次我依赖于第三方库,我不想将其包含在静态库中。我只是想引用它。但是,每当我构建静态库时,就会出现词法或预处理器错误,我知道当库从项目中丢失时,这是很常见的。发生错误的原因是我从项目中删除了库,因为我不想将它内置到静态库中

有问题的图书馆正在建立网络。在安装静态库时,我将使用cocoapod显式安装依赖项


谢谢。

您可以将lib.a和lib.h添加到您的项目中。

当您引用外部代码时,您将始终需要让项目可以访问标题,否则编译器将无法告诉您是否以正确的方式引用了外部代码。例如,该方法是否存在,您是否提供了正确的类型等

只有在实际多次定义符号时,才会出现重复符号问题。例如,定义类相关的Objective-C符号仅在
@实现…@end
块中发生,而在
@接口…@end
块中不发生。后者只让编译器理解事物

(这也是为什么您可以为例如私有类定义一个
@接口
,并将其作为正常使用,而不会导致重复符号。)

因此,您可以多次包含这样的“干净”标题,而不必担心它。请注意,我说的是“clean”,因为您实际上可以在头中定义符号,例如,在头中定义C函数,或者如果您觉得特别糟糕,甚至可以定义Objective-C
@实现。但是你只需要测试一下


当你最终链接到第三方依赖项和你的依赖项时,链接器会抱怨,毕竟有重复的符号。在这种情况下,请务必查看诸如
nm
之类的工具,它们列出了存档中的符号。

我试图避免将第三方库中的符号添加到我的项目中,因为它被编译到主库中。有没有办法从Xcode项目中挑选/选择哪些文件放在静态库中?为什么需要这个?如果你想挑选/选择哪些文件编译到主库中,你可以将你需要的文件添加到主项目中。明白了-谢谢!你的回答有一部分是对的,所以我会投赞成票!似乎每个静态库都会访问未编译到项目中的其他库。请尝试在项目中使用其他库的头文件。谢谢您的回复。当有人下载整个库时会发生什么,因为它是必需的依赖项?是否会出现重复符号错误,因为它们现在是.h文件的两个副本。不应该。可以在多个.m中包含相同的.h文件。我以前在我的主项目中有子项目。在编译时,它将编译库,然后编译主应用程序。这些库实际上是相互引用的,您让它们了解其他库的方式是包含它们的所有.h文件。但是你确定如果你编译一个.a,它会包含其他的.a吗?我不这么认为。嗯,AFNetworking不是一个静态库。它是完全开源的,所以我在我的项目中导入了它。在我的项目的封闭源代码版本中,我只想引用AFNetworking,但实际上不想将其包含在最终版本中。a如果可能的话,这就是我想弄清楚的方法。我能想到的最好的例子是考虑AFNETWORKION类似或。我可以编译我的.a而不包括那些库。我想对这个第三方库也这样做。对不起。。我只有这些了。这比我的工资等级高。:)或许最好还是忘掉标题吧。”“Clean”头只用于编译器,它们不包括在构建中。在您的例子中,您真正指的是API兼容性。对于这一点,我们无能为力,按照我个人的优先顺序:1)在您的文档中说明所需的版本。2) 如果依赖项(如AFNetworking)公开了一个“版本”,请检查该版本。3) 在运行时检查预期的方法并断言这些方法(虽然这并不能防止现有的方法,但已经更改了)。总之,这个可传递依赖性问题正是CocoaPods试图解决的;)离题:我显然不明白这是怎么回事。我过早地提交了我的第一条评论,因为我希望插入新行。啊,明白了,你想通过CocoaPods发布它。那么请调查一下。我们不能确保所有的lib都遵循它,但我确实相信AFNetworking会遵循它,这意味着您可以依赖它来满足版本要求,比如so
~>2
,这应该可以防止API更改。