C ++代码未定义使用共享库时的函数引用

时间:2017-09-24 17:57:49

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

compiler output

我正在尝试编译一个简单的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

1 个答案:

答案 0 :(得分: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(根据您的意愿)
  9. 所以,确实,在这种情况下有未定义的符号。 我使用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 _ 对应的则没有。

    因此,我删除了库源,并再次按照 1 2 步骤操作。然后我在非 _flow _ 函数名称之后将这两行添加到./libndpi.sym

    set_ndpi_flow_malloc
    set_ndpi_flow_free
    

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

    我可能认为忘记将符号名称添加到.sym文件是一种错误。以下是 Vito Piserchia commit。也许最好是联系那个人,或者,lucaderi,给人一种狂热贡献者的印象,告诉他们这些符号的问题。正如您可以从libndpi.sym commit history那里学到的,他们经常会添加缺少的符号"等等。

    那就是它。