【问题标题】:Marking a symbol as undefined in iOS framework在iOS框架中将符号标记为未定义
【发布时间】:2017-02-18 20:03:33
【问题描述】:

我正在使用 Swift 和 Objective-C 构建一个 iOS 框架(由于其他限制,必须同时使用它们)。 在我的 Objective-c 代码中,我需要使用一个符号,称为 MyUndefinedSymbol,它将在运行时可用,但在编译和链接时不可用。

我将符号定义为extern 以消除编译器错误: extern void MyUndefinedSymbol();

但是,链接器抱怨 MyUndefinedSymbol 未定义。

问题是:如何让链接器忽略那个未定义的符号?

搜索这个给我带来了很多解决方案,但都没有奏效。 我尝试过的事情:

  1. 使用-undefined 链接器标志。它已被弃用,并且不允许启用位码(我需要)。
  2. 使用 clang 的 -U 标志。
  3. 使用__attribute__((weak_import)) 添加weak_import 属性
  4. 使用--unresolved-symbols=ignore-all

【问题讨论】:

  • 运行时符号从何而来?
  • 框架(本质上是一个插件)将被定义此符号的其他应用程序嵌入。 IOW,该符号将在这些应用程序的编译时可用,但在框架的编译时不可用...
  • 您可以在运行时使用dlsym() 加载它...
  • @MartinR,我认为这正是我所需要的!但是,我无法让它工作。我能够找到并使用作为框架一部分的符号,但找不到作为使用框架的应用程序一部分的符号。用RTLD_DEFAULT 尝试过。我错过了什么吗?
  • 它是在主可执行文件中定义为 C 还是 Swift 函数?

标签: ios objective-c swift xcode linker


【解决方案1】:

对于未来的读者: 似乎正确的做法与@Martin R 建议的完全一样——使用dlsym() 在运行时加载符号。 请注意,dlsym 不适用于标记为“内部”的符号。 您可以通过在库/二进制文件上运行 nm -m 来确定符号是否是内部的。

此外,如果您禁用位码,问题本身的解决方案 1 和 2 应该可以工作。

【讨论】:

  • 感谢您回来回答这个问题。不幸的是,我的情况是符号是内部的(非外部的)!呸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多