【问题标题】:Xcode -- get force_load to work with relative pathsXcode -- 让 force_load 使用相对路径
【发布时间】:2011-06-14 19:25:31
【问题描述】:

链接到 Xcode 项目时,某些库需要 -all_load 链接器标志。但是,如果库之间存在符号冲突,这会导致链接器错误。解决方案是使用 -force_load,它可以有效地让您在某些库上使用 -all_load,但不能在其他库上使用。

但是,这反过来又导致了一个新问题,至少对我来说是这样。每当我将 -force_load 与库的 relative 路径一起使用时,链接器总是会发现库与其自身之间的符号冲突。看来链接器认为绝对路径的库和相对路径的库是不同的库,因此发现库和自身有冲突。

我可以通过使用带有标志的 absolute 路径来避免这种情况。但这不是一个很好的解决方案,因为将库的源代码保存在我的文档目录中很方便。但是文档目录的路径在其他机器上会有所不同。

问题:任何人都可以让 force_load 使用库的相对路径吗?

编辑:有关背景信息,请参阅this question

【问题讨论】:

  • 我需要$(SRCROOT) 否则我会得到重复的符号

标签: iphone xcode ios linker static-libraries


【解决方案1】:

使用 Xcode 4,如果您将库项目包含到您的应用项目中,那么您可以将其添加到 Other Linker Flags:

-force_load $(BUILT_PRODUCTS_DIR)/<library_name.a>

您仍然需要依赖,并且您还需要将库添加到框架和库的链接阶段列表中。

编辑:Apple 现在表示,从某些 Xcode 4 版本开始,您可以简单地使用此链接器标志:“-ObjC”来获取具有正确加载类别的库。该标志在 Xcode 5 中对我来说工作得很好。人们仍在为这个答案投票,但我怀疑 -ObjC 标志现在是最好的解决方案。

【讨论】:

  • @AlexanderVasenin 这是一个相当不错的声明,您应该使用此处支持它的帖子的链接来支持它。就我个人而言,直到现在我才听说过。
  • 示例:link 1link 2
  • @AlexanderVasenin 第一个链接是影射(传闻),第二个是实际问题。但是问题(恕我直言)根本不是问题。有人想链接一个依赖于另一个库的库。用户不想要依赖库,因此希望避免链接错误并像没有依赖库一样继续。我认为这是一个糟糕的决定,因为开发人员如何确定其他库不会收到消息(从而导致用户应用程序崩溃)?最后,这是开发人员的决定,但不是 Apple -Objc 标志中的错误或缺陷。
  • 大卫,你的回答是对的,我实际上赞成它,但我在搜索如何摆脱 -ObjC 标志时发现它破坏了一些我无意重写的写得不好的代码。跨度>
  • @AlexanderVasenin 我感谢你!我只是想确保这篇文章的未来读者知道完整的故事!最美好的祝愿!
【解决方案2】:

这对我有用。像上面的答案一样,您仍然需要在项目中包含该库。

-force_load $(SRCROOT)/pathToLibraryFromProject/libname.a

对于路径,只有项目中的文件夹会导致您放置库的位置,例如 BaseFoler/Subfolder/libName.a。

【讨论】:

  • 这对我有用。只输入相对 URL 对我不起作用。所以我必须输入绝对 URL 才能工作。这是在 Xcode 8.3、Swift 3 上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2010-10-05
  • 2012-01-10
  • 2017-04-12
相关资源
最近更新 更多