gpt4 book ai didi

linux - 链接新版本的 libpcap 库

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:19 24 4
gpt4 key购买 nike

我想在 CentOS 5.5 机器上安装和使用最新版本 (1.1.1) 的 libpcap。我通过以下方式配置、编译和安装了新的 libpcap 库:

[dima@localhost libpcap-1.1.1]$ ./configure
[dima@localhost libpcap-1.1.1]$ make
[dima@localhost libpcap-1.1.1]$ sudo make install

但是当我尝试链接 libpcap 共享库(使用 -lpcap 链接器标志)时,我的应用程序链接到旧版本的 libpcap 库(使用 pcap_lib_version() 验证 API 调用。

我需要做什么才能链接到新的 libpcap 库?

提前致谢

最佳答案

在不指定 --prefix 或其他安装位置选项的情况下,默认情况下会将新的 libpcap 安装在 /usr/local/lib 中。假设您要覆盖的旧版本是 CentOS 系统版本,/usr/lib 中也是如此。

因此,链接器似乎在搜索 /usr/local/lib 之前搜索 /usr/lib

您可以通过将 -Wl,-Map,foo.map 添加到链接您的应用程序的 GCC 命令,然后 grep 生成的 foo 来准确查看链接到哪个 libpcap。 libpcap 的 map 文件。

您可以通过查看(两者)的输出来查看链接器正在使用的库搜索路径

gcc -print-search-dirs | grep ^libraries
ld --verbose | grep SEARCH_DIR

如果/usr/lib出现在/usr/local/lib之前,你可以添加-L/usr/local/lib到您的链接命令对它们重新排序并选择您的新库。但这确实是一个 hack。


所有这些都是针对链接时出现问题的情况。根据此共享库的版本控制方式,真正的问题可能出现在动态链接期间运行应用程序时。或者两者兼而有之。

当您在应用程序上运行 ldd 时,您看到为 libpcap 列出的路径是什么?当您使用 -L/usr/local/lib 构建应用程序时会怎么样?

ldd yourapp

要强制动态链接器在 /usr/local/lib 中找到您的共享库,您可能需要查看链接器的 -rpath 选项,或者 LD_LIBRARY_PATH 环境变量。将 -L/usr/local/lib -Wl,-rpath,/usr/local/lib 添加到您的链接命令肯定会确保您的新版本库得到使用。但是 -rpathLD_LIBRARY_PATH 更像是一种 hack,如果您在没有仔细考虑的情况下尝试将您的应用程序二进制文件提供给其他人,则会引入其他问题。


所有这一切的非 hackish 方法是确保将新的共享库安装到系统已知的目录中。这可能意味着 /usr/lib 如果这是库的现有版本所在的位置。

您可以通过在构建 libpcap 时将 --prefix=/usr 添加到配置命令来实现。在那里安装新的 libpcap 后,您应该能够编译并链接您的应用程序,而无需任何额外的链接器选项。

但是这会干扰包管理,因此在通过包管理器更新时会导致其他问题。因此,您可能想先卸载系统 libpcap 软件包,或者总体上研究一下在 CentOS 上替换系统软件包的正确方法。

关于linux - 链接新版本的 libpcap 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902573/

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