【问题标题】:gcc returns "undefined reference to" function after editing library source codegcc 在编辑库源代码后返回“未定义的引用”函数
【发布时间】:2020-07-19 11:21:50
【问题描述】:
  • 我在某个库的.c源代码中添加了一个函数,并在相应的.h文件中添加了函数头,然后安装了整个程序(./configure;make;make install),没有错误。

  • nm 检查我的函数是否存在于共享库 (.so) 中(由上面的编译生成):它表示该函数在那里

  • 在编译调用我的自定义函数并将其与库链接的程序时,我收到以下错误:

$ gcc -o test test.c -lnftables
/tmp/cc47BbcQ.o: In function `main':
test.c:(.text+0x11): undefined reference to print_hello()
collect2: error: ld returned 1 exit status
  • 但是当编译一个程序时没有任何引用我的自定义函数时,它可以正常运行并且没有错误。

系统:Debian 9 延伸

内存:8GB

CPU:Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz

库:nftables 9.4(来源here

gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516

【问题讨论】:

  • 您应该包含nm 调用的输出,将其限制在函数的定义中。我猜测被报告的类型将是t,而不是T - 即在库本地,而不是导出
  • @Petesh:你说得对# nm /usr/local/lib/libnftables.so |grep print_hello 0000000000042df0 t print_hello那我该怎么办?

标签: c


【解决方案1】:

nftables 库只使特定的东西在外部可用。它通过两种机制实现:

  • 默认可见性
  • 地图文件

对源代码的一点阅读表明,用于控制可见性的文档化机制是以下声明:

EXPORT_SYMBOL(routine);

这是在utils.h文件中定义的源文件。所以如果你添加一个:

EXPORT_SYMBOL(print_hello);

无论是在./src/libnftables.c,还是在您声明print_hello 的文件中(确保您已在该文件中包含utils.h),都应该包含可见性。

第二个是mapfile,它定义了.so的约定接口,这个在libnftables.map文件中。您还需要将 print_hello 导出添加到此文件的 global: 部分,以便将其导出到库的 API 中。

【讨论】:

  • 谢谢@Petesh EXPORT_SYMBOL 宏绝对是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多