链接新版本的libpcap库

Dim*_*ima 0 linux linker shared-libraries pcap libpcap

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

[dima@localhost libpcap-1.1.1]$ ./configure
[dima@localhost libpcap-1.1.1]$ make
[dima@localhost libpcap-1.1.1]$ sudo make install
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢

Joh*_*all 5

--prefix默认情况下,未指定或其他安装位置选项的配置将在/ usr/local/lib中安装新的libpcap .据推测,您试图覆盖的旧版本是CentOS系统,因此在/ usr/lib中也是如此.

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

您可以通过添加-Wl,-Map,foo.map到链接应用程序的GCC命令以及为生成的foo.map文件进行grepping来确切地查看链接到哪个libpcap libpcap.

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

gcc -print-search-dirs | grep ^libraries
ld --verbose | grep SEARCH_DIR
Run Code Online (Sandbox Code Playgroud)

如果/ usr/lib出现在/ usr/local/lib之前,则可以添加-L/usr/local/lib到link命令以重新排序它们并选择新库.但真的那是一个黑客.


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

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

ldd yourapp
Run Code Online (Sandbox Code Playgroud)

要强制动态链接器在/ usr/local/lib中查找共享库,您可能希望查看链接器的-rpath选项或LD_LIBRARY_PATH环境变量.添加-L/usr/local/lib -Wl,-rpath,/usr/local/lib到链接命令肯定会确保您使用新版本的库.但两者-rpathLD_LIBRARY_PATH都更是一个黑客,并引入其他的问题,如果你尝试给您的应用程序二进制别人没有仔细考虑.


所有这些的非hackish方法是确保您将新的共享库安装到系统已知的目录中.这可能意味着/ usr/lib,如果这是库的现有版本.

您可以通过--prefix=/usr在构建libpcap时添加configure命令来执行此操作.在那里安装新的libpcap后,您应该能够编译并链接您的应用程序,而无需任何额外的链接器选项.

但是这会干扰程序包管理,因此在通过程序包管理器进行更新时会导致其他问题.因此,您可能希望首先卸载系统libpcap软件包,或者通常查看在CentOS上替换系统软件包的正确方法.