加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 使用特定项目中的框架的静态库

发布时间:2020-12-15 02:02:07 所属栏目:百科 来源:网络整理
导读:我创建了一个包含我所有泛型类的静态库。这些类中的一些使用框架。 现在我有两个项目,一个使用一些使用框架的类,另一个不使用任何使用框架的类。 因为静态库不支持包括框架(如果我是正确的)。我必须将框架包含在使用它们的项目中。但是当我编译不使用任何
我创建了一个包含我所有泛型类的静态库。这些类中的一些使用框架。

现在我有两个项目,一个使用一些使用框架的类,另一个不使用任何使用框架的类。

因为静态库不支持包括框架(如果我是正确的)。我必须将框架包含在使用它们的项目中。但是当我编译不使用任何框架类的项目时,编译器会因为仍然需要框架而中断。现在我知道它尝试从库中编译所有(未使用的)类,因为我使用链接器标志’-ObjC’来防止“无法识别的选择器”错误。

有没有人知道如何只编译每个项目所需的源文件?并且防止所有框架都被包含在使用我的静态库的所有项目中?

解决方法

首先,你是正确的,一个静态库不能包含任何框架和其他静态库,它只是构成该特定静态库的所有对象文件(* .obj)的集合。

Does anyone know how to compile only the required source files per project?

链接器默认情况下只链接包含应用程序引用的符号的静态库中的对象文件。因此,如果您的静态库中有两个文件a.m和b.m,并且您只在主程序中使用a.m中的符号,则b.o(从b.c生成的对象文件)将不会出现在最终的可执行文件中。作为子案例,如果b.m使用仅声明(未实现)的函数/类c,则不会得到任何链接器错误。一旦你的程序中包含了b.m中的一些符号,b.o也将被链接,并且由于c的缺少实现而导致连接器错误。

如果您希望这种选择发生在符号而不是以对象级粒度发生,请在Xcode中启用死码剥离。这对应于项目的“构建设置信息”窗格中的gcc选项-Wl,-dead_strip(=链接器选项-dead_strip)。这将确保进一步优化。

在你的情况下,尽管如此,正如你所说,这是使用“-ObjC”链接器标志来击败这个机制。所以这其实取决于你。如果您删除-Objc标志,您可以免费获得您喜欢的行为,同时失去对选择器的严格检查。

And prevent from all frameworks having to be included in all projects that use my static library?

Xcode / GCC支持一个称为“weak linking”的链接选项,它允许懒惰地加载框架或静态库,即只有当其中一个符号被实际使用时。
可以通过链接器标志(参见上面的Apple doc)或通过Xcode UI(目标 – >信息 – >通用 – >链接库)启用“弱链接”。

无论如何,框架或库在所有情况下都必须在编译/链接时可用:“weak”选项仅影响在运行时首次加载框架的时刻。因此,我不认为这对您有用,因为您需要反正将框架包含在所有项目中,这是您不想要的。

作为附注,weak_linking是一种选项,当使用仅在较新的SDK版本(例如4.3.2)上可用的功能时,这些选项大多是有意义的,同时还支持在旧版SDK(例如3.1.3)上部署。在这种情况下,您依赖于较新的SDK框架将在较新的部署设备上实际可用的事实,并且您有条件地编译需要它的功能,以便在较旧的设备上不需要它们(并且不会生成尝试加载较新版本的框架和崩溃)。

为了使事情变得更糟,GCC不支持称为“自动链接”与Microsoft编译器的功能,允许通过在源文件中的#pragma注释来指定要链接的库。这可以提供一种解决方法,但不在此。

所以,我真的很抱歉,你应该使用一种可以同样满足你的需求的不同方法:

>删除-ObjC标志;>根据外部框架的依赖关系,将静态库拆分为两个或多个部分;>直接包括源文件。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读