我正在尝试编译一个简单的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
答案 0 :(得分:1)
我努力重现你的步骤。
./autogen.sh
(根据README.md
,还需要在系统中安装libpcap-dev
个包裹)./configure
(根据README.md
)make
(根据README.md
)test.cpp
的主目录中创建一个文件并将代码放在那里(但是,我认为include语句应该简称为#include "ndpi_api.h"
)g++ -c -O3 -Wall -I ./src/include ~/test.cpp
(根据您的意愿)g++ -O3 -Wall -o test test.o -L ./lib -lndpi
(根据您的意愿)所以,确实,在这种情况下有未定义的符号。
我使用nm -gC ./lib/libndpi.so
来读取符号列表并且找不到
set_ndpi_flow_malloc
和set_ndpi_flow_free
。两种方式都没有提到。
然后我检查了./src/include/ndpi_api.h
和./src/lib/ndpi_main.c
并且无法解决那里可能出错的问题。一切似乎都没问题,因为这两个函数的实现和定义类似于没有 _flow _ 的对应函数。然而,差异当然存在并且可以在./libndpi.sym
文件中观察到。
您可能会看到,set_ndpi_malloc
和set_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那里学到的,他们经常会添加缺少的符号"等等。
那就是它。