Gcc nm符号输出t vs t在共享so库中

Gcc nm符号输出t vs t在共享so库中,gcc,linker,shared-libraries,Gcc,Linker,Shared Libraries,我在用户空间fuse库中添加了一个新函数(fuse\u lowlevel\u notify\u inval\u目录)。 libfuse.so的编译和创建已顺利完成。 但是当我的应用程序尝试使用这个新函数时,链接器抛出了一个错误:未定义对“fuse\u lowlevel\u notify\u inval\u目录”的引用 collect2:ld返回了1个退出状态 当我和nm联系时 nm ../libfuse.so | grep inval 00000000000154ed T fuse_invali

我在用户空间fuse库中添加了一个新函数(fuse\u lowlevel\u notify\u inval\u目录)。 libfuse.so的编译和创建已顺利完成。 但是当我的应用程序尝试使用这个新函数时,链接器抛出了一个错误:未定义对“fuse\u lowlevel\u notify\u inval\u目录”的引用 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。你知道我可能做错了什么吗

你知道我可能做错了什么吗

t
函数确实是库的本地函数。这可能是由于一些原因造成的。最有可能的是:

  • 您将函数声明为static,或者
  • 您使用
    -fvisibility=hidden
    编译库,并且在函数上没有
    \uuuuu属性((可见性(“默认”))
    ,或者
  • 您使用链接器版本脚本(即带有
    --version script=libfoo.version
    标志)链接了此库,该脚本隐藏了所有函数,但显式导出的函数除外,并且您没有将函数添加到该列表中

    请参阅使用
    --version script
    限制符号可见性的示例

  • 显然你没有给你的函数外部链接。至少需要代码来提供更多帮助。第三点是问题。Fuse有一些版本脚本并显式导出函数。