【问题标题】:C++ code undefined reference to function when using shared library使用共享库时 C++ 代码未定义对函数的引用
【发布时间】:2017-09-24 17:57:49
【问题描述】:

我正在尝试编译一个简单的 c++ 程序,该程序调用 NDPI C 库中的一些函数。使用共享库(.so 文件)编译时,在库中找不到某些函数(如 set_ndpi_flow_malloc),但似乎能够找到另一个名为 set_ndpi_malloc 的函数。

注意:我相信它找不到的函数是从1.8版本更新到2.0版本时新添加到库中的,但我使用的库文件都是从2.0版本的源代码编译的。

奇怪的是,当我使用静态库 (.a) 进行编译时,找到这些函数没有问题。

查看上面链接的图片以查看每次编译器的输出和代码。 两次编译尝试都是在一分钟内完成的,除了 makefile 中的一行使用静态库而不是共享库进行编译之外,没有任何变化。

更新

这已被确定为库未导出所有符号的问题。

在 github 上查看问题:https://github.com/ntop/nDPI/issues/459

【问题讨论】:

标签: c++ c g++ shared-libraries


【解决方案1】:

我努力重现你的步骤。

  1. Clone(从他们的 Github 下载/解压)库源代码
  2. 进入库的源目录
  3. ./autogen.sh(根据README.md,也需要在系统中安装libpcap-dev包)
  4. ./configure(根据README.md
  5. make(根据README.md
  6. 在主目录中创建一个名为 test.cpp 的文件并将您的代码放在那里(但是,我认为 include 语句应改写为简单的 #include "ndpi_api.h"
  7. g++ -c -O3 -Wall -I ./src/include ~/test.cpp(随心所欲)
  8. g++ -O3 -Wall -o test test.o -L ./lib -lndpi(根据您的意愿)

因此,在这种情况下,确实存在未定义的符号。 我使用nm -gC ./lib/libndpi.so 读取符号列表并没有找到 set_ndpi_flow_mallocset_ndpi_flow_free。两种方式都没有提及。

然后我检查了./src/include/ndpi_api.h./src/lib/ndpi_main.c,我无法理解那里可能出了什么问题。一切似乎都很好,因为这两个函数的实现和定义与没有 _flow_ 的对应函数类似。尽管如此,差异肯定存在并且可以在./libndpi.sym 文件中观察到。 如您所见,set_ndpi_mallocset_ndpi_free 列在其中,而它们的 _flow_ 对应项没有。

所以,我删除了库源并再次按照步骤12进行了一次。然后我将这两行添加到./libndpi.sym,就在非_flow_函数名之后:

set_ndpi_flow_malloc
set_ndpi_flow_free

接下来我必须继续执行步骤3-8,最后一步成功了。 此外,nm -gC ./lib/libndpi.so 可以很好地显示感兴趣的符号。

我可能认为忘记将符号名称添加到.sym 文件是某种错误。这是 Vito Piserchiacommit。也许你最好联系那个人,或者lucaderi,他给人的印象是一个狂热的贡献者,告诉他们符号的问题。正如你可能从libndpi.symcommit history 中了解到的,他们经常“添加缺失的符号”等。

就是这样。

【讨论】:

  • 非常感谢您的帮助!我按照您的步骤验证了我的测试程序现在可以正常工作。我确实在这里github.com/ntop/nDPI/issues/459 提交了一个问题,既然您已经确定了问题的原因,我将向该问题添加更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多