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

C++ code undefined reference to function when using shared library

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

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

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

查看上面链接的图片,查看每次编译器输出和代码。 两次编译尝试相隔不到一分钟,除了 makefile 中的一行使用静态库而不是共享库进行编译外,没有任何更改。

更新

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

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

我努力重现了您的步骤。

  1. Clone (download/unpack) 来自他们 Github
  2. 的库源
  3. 进入库源目录
  4. ./autogen.sh(根据README.md,另外:系统需要安装libpcap-dev包)
  5. ./configure(根据README.md
  6. make(根据README.md
  7. 在主目录中创建一个名为 test.cpp 的文件并将您的代码放在那里(但是,我认为 include 语句应改写为简单 #include "ndpi_api.h"
  8. g++ -c -O3 -Wall -I ./src/include ~/test.cpp(随心所欲)
  9. 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 文件是某种错误。这里是commit by Vito Piserchia. Perhaps it would be better if you contacted that person or, maybe, lucaderi, who makes the impression of an avid contributor, to tell them about the issue with the symbols. As you may learn from libndpi.sym commit history,他们经常"add missing symbols",等等

就是这样。