gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:07:52 25 4
gpt4 key购买 nike

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. 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(根据您的意愿)

因此,在这种情况下确实存在 undefined symbol 。我用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作者:Vito Piserchia。也许您联系那个人会更好,或者,也许,lucaderi ,谁给人留下了热心贡献者的印象,告诉他们符号的问题。正如您可以从 libndpi.sym commit history 中了解到的那样,他们经常“添加缺失的符号”等。

就是这样。

关于使用共享库时 C++ 代码未定义对函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46393154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com