11

我有一个符号在 Xcode 动态库目标中被引用,但它没有在那里定义。我需要这个符号是未定义的。这是因为它将在包含它的每个进程中以不同的方式编译(基于一些编译时间定义)。

Xcode 中的动态库目标无法链接,因为它包含对此符号的引用(这并不意外),但我知道该符号将在运行时可用。我将把这个函数编译到公共库链接到的每个目标中。

我试图让链接器在运行时标记这个特定的符号以进行动态查找。

如果我在我的 Xcode 项目中将“-undefined dynamic_lookup”指定为“其他链接器标志”之一,我就能够链接它。问题是我不想走那么远。我知道只有 1 个符号应该是未定义的。如果其余符号未定义,我希望所有其余符号都生成错误(我想基本上避免运行时丢失符号错误)。

我找到了一个 ld 链接器选项,它似乎应该满足我的需要(来自 ld 手册页):

-U symbol_name
             Specified that it is ok for symbol_name to have no definition.  With -two_levelnamespace, the resulting symbol will be marked dynamic_lookup which means dyld will search all loaded images.

但是,我似乎无法让它工作。每当我在“其他链接器标志”中指定“-U symbolName”或“-UsymbolName”时,我仍然会收到此链接器错误:

Undefined symbols for architecture x86_64:
     "_symbolName", referenced from: <various object files>

我可能错误地使用 -U 吗?这不是我真正需要的选项,还是只是没有像预期的那样工作?

4

2 回答 2

6

设置-Wl,-undefined,dynamic_lookupOTHER_LDFLAGS

链接:Xcode clang 链接:构建动态框架(或 dylib)不嵌入依赖项

于 2016-04-16T10:29:24.893 回答
2

设置-Wl,-undefined,dynamic_lookup是危险的,因为它会禁用所有未定义的警告。

使用-Wl,-U,symbol_nameinOTHER_LDFLAGS禁用单个符号的警告。

在 Xcode 中:

  • 转到项目/选择目标
  • 单击构建设置
  • 搜索Other Linker Flags
  • 输入选项
于 2019-11-02T13:44:30.347 回答