我在用户空间保险丝库中添加了一个新功能(fuse_lowlevel_notify_inval_directory)。 libfuse.so的编译和创建完成没有错误。 但是当我的应用程序尝试使用这个新函数时,链接器抛出错误:未定义引用`fuse_lowlevel_notify_inval_directory' collect2:ld返回1退出状态
当我用nm检查时
nm ../libfuse.so | grep inval
00000000000154ed T fuse_invalidate
**000000000001e142 t fuse_lowlevel_notify_inval_directory**
000000000001e26c T fuse_lowlevel_notify_inval_entry
000000000001e1cb T fuse_lowlevel_notify_inval_inode
T / t表示符号出现在文本部分中。如果是大写,则符号为全局(外部)。我怀疑这是问题所在。新添加的功能显示小写t,而其他旧功能显示大写字母T.任何关于我可能做错的想法?
答案 0 :(得分:16)
对我可能做错了什么的想法?
t
函数确实是库的本地函数。这可能由于一些或多个原因而发生。最可能的是:
static
或-fvisibility=hidden
编译了库,不在函数上有__attribure__((visibility("default")))
,或者--version-script=libfoo.version
标志)链接,该脚本隐藏了所有功能,但显式导出的功能除外,并且您没有将功能添加到该列表中。 --version-script
限制符号可见性的示例。