我有一个专门的共享库,它在可执行文件的执行期间动态加载。该库提供函数 b()
。此函数依次调用函数 a()
。
a
函数是在可执行文件中定义的,而不是库本身,因此我希望能够从库中调用一些可执行文件的代码。我已经设法使用 -undefined dynamic_lookup
标志让 clang 保留这些符号用于延迟绑定(bind),但是当我尝试运行可执行文件时 dyld 仍然提示:
dyld: lazy symbol binding failed: Symbol not found: _a
Referenced from: /usr/local/lib/myLib.dylib
Expected in: flat namespace
如何链接这个符号?
事实证明,这是由于 Xcode 默认不导出符号造成的。您可以通过更改 LLVM 代码生成build设置下的“默认隐藏的符号”选项来解决此问题。如果您不使用 Xcode,这将控制是否在命令行上使用 -fvisiblity=hidden
标志。
或者,您可以将此选项保持打开状态,并通过将 __attribute__((visibility("default")))
属性添加到您要导出的函数来选择性地导出符号。
我是一名优秀的程序员,十分优秀!