我有一个在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吗?这不是我真正需要的选择,还是它不像它应该的那样工作?
答案 0 :(得分:5)
将-Wl,-undefined,dynamic_lookup
设为OTHER_LDFLAGS
。
链接:Xcode clang link: Build Dynamic Framework (or dylib) not embed dependencies
答案 1 :(得分:0)
设置-Wl,-undefined,dynamic_lookup
很危险,因为它会禁用所有未定义的警告。
使用-Wl,-U,symbol_name
中的OTHER_LDFLAGS
禁用单个符号的警告。
在Xcode中:
Other Linker Flags