gcc返回“;未定义的引用;编辑库源代码后的函数
我在某个库的.c源代码中添加了一个函数,并在相应的.h文件中添加了函数头,然后安装了整个程序(./configure;make;make install),没有错误gcc返回“;未定义的引用;编辑库源代码后的函数,c,C,我在某个库的.c源代码中添加了一个函数,并在相应的.h文件中添加了函数头,然后安装了整个程序(./configure;make;make install),没有错误 如果我的函数存在于共享库(.so)(由上面的编译生成)中,请使用nm进行检查:它说函数存在于共享库中 编译一个调用自定义函数的程序并将其与库链接时,出现以下错误: 但是,当编译一个程序而不引用我的自定义函数时,它可以正常工作并运行,不会出错 系统:Debian 9 stretch 内存:8GB CPU:Intel(R)C
- 但是,当编译一个程序而不引用我的自定义函数时,它可以正常工作并运行,不会出错
gcc(Debian 6.3.0-18+deb9u1)6.3.0 20170516nftables库只提供外部可用的特定内容。它通过两种机制完成:
- 默认可见性
- 地图文件
EXPORT_SYMBOL(routine);
它在源文件的utils.h
文件中定义。因此,如果您添加一个:
EXPORT_SYMBOL(print_hello);
无论是在/src/libnftables.c
中,还是在您声明的文件中,都应该包含可见性
第二件事是mapfile,它定义了
.so
的约定接口,它位于libnftables.map
文件中。您还需要在global:
部分将print\u hello
导出添加到此文件,以便将其导出到库的API中。nftables库仅使特定的内容在外部可用。它通过两种机制完成:
- 默认可见性
- 地图文件
EXPORT_SYMBOL(routine);
它在源文件的utils.h
文件中定义。因此,如果您添加一个:
EXPORT_SYMBOL(print_hello);
无论是在/src/libnftables.c
中,还是在您声明的文件中,都应该包含可见性
第二件事是mapfile,它定义了
.so
的约定接口,它位于libnftables.map
文件中。您还需要在global:
部分将print\u hello
导出添加到此文件,以便将其导出到库的API中。您应该包括nm
调用的输出,将其限制在函数的定义中。我猜报告的类型将是t
,而不是t
——即库的本地类型,而不是本地类型exported@Petesh:您是对的#nm/usr/local/lib/libnftables.so | grep print_hello 0000000000042df0 t print_hello
我该怎么办?您应该包括nm
调用的输出,仅限于函数的定义。我猜报告的类型将是t
,而不是t
——即图书馆的本地类型,而不是exported@Petesh:你说得对#nm/usr/local/lib/libnftables.so | grep print_hello 0000000000042df0 t print_hello
那我该怎么办?谢谢@Petesh导出符号宏肯定是解决方案。谢谢@Petesh导出符号宏肯定是解决方案。