Gcc nm符号输出t vs t在共享so库中
我在用户空间fuse库中添加了一个新函数(fuse\u lowlevel\u notify\u inval\u目录)。 libfuse.so的编译和创建已顺利完成。 但是当我的应用程序尝试使用这个新函数时,链接器抛出了一个错误:未定义对“fuse\u lowlevel\u notify\u inval\u目录”的引用 collect2:ld返回了1个退出状态 当我和nm联系时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
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
函数确实是库的本地函数。这可能是由于一些原因造成的。最有可能的是:
-fvisibility=hidden
编译库,并且在函数上没有\uuuuu属性((可见性(“默认”))
,或者--version script=libfoo.version
标志)链接了此库,该脚本隐藏了所有函数,但显式导出的函数除外,并且您没有将函数添加到该列表中请参阅使用
--version script
限制符号可见性的示例显然你没有给你的函数外部链接。至少需要代码来提供更多帮助。第三点是问题。Fuse有一些版本脚本并显式导出函数。