Linux 链接到新版本的libpcap库

Linux 链接到新版本的libpcap库,linux,linker,shared-libraries,pcap,libpcap,Linux,Linker,Shared Libraries,Pcap,Libpcap,我想在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链接器标志)时,我的应用程序链接到旧版本

我想在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\u lib\u version()
API调用验证)

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


提前感谢您

在未指定
--prefix
或其他安装位置选项的情况下进行配置,默认情况下,将在/usr/local/lib中安装新的libpcap。您尝试覆盖的旧版本可能是system CentOS one,在/usr/lib中也是如此

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

通过将
-Wl,-Map,foo.Map
添加到链接应用程序的GCC命令中,并为
libpcap
重新映射生成的foo.Map文件,您可以准确地看到链接的libpcap

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

如果/usr/lib出现在/usr/local/lib之前,您可以将
-L/usr/local/lib
添加到您的link命令中,对它们进行重新排序并选择新的库。但实际上,这是一种攻击


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

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

ldd yourapp
要强制动态链接器在/usr/local/lib中查找您的共享库,您可能需要查看链接器的
-rpath
选项,或
LD\u library\u PATH
环境变量。将
-L/usr/local/lib-Wl,-rpath,/usr/local/lib
添加到link命令中肯定会确保新版本的库得到使用d、 但是
-rpath
LD\u LIBRARY\u PATH
更像是一种黑客行为,如果您试图在未经仔细考虑的情况下将应用程序二进制文件提供给其他人,则会带来其他问题


解决所有这些问题的非黑客方法是确保将新的共享库安装到系统已知的目录中。如果库的现有版本所在的目录是/usr/lib,那么这可能意味着/usr/lib

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


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

在未指定
--前缀
或其他安装loca的情况下进行配置默认情况下,选项将在/usr/local/lib中安装新的libpcap。您试图覆盖的旧版本可能是system CentOS one,在/usr/lib中也是如此

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

通过将
-Wl,-Map,foo.Map
添加到链接应用程序的GCC命令中,并为
libpcap
重新映射生成的foo.Map文件,您可以准确地看到链接的libpcap

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

如果/usr/lib出现在/usr/local/lib之前,您可以将
-L/usr/local/lib
添加到您的link命令中,对它们进行重新排序并选择新的库。但实际上,这是一种攻击


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

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

ldd yourapp
要强制动态链接器在/usr/local/lib中查找您的共享库,您可能需要查看链接器的
-rpath
选项,或
LD\u library\u PATH
环境变量。将
-L/usr/local/lib-Wl,-rpath,/usr/local/lib
添加到link命令中肯定会确保新版本的库得到使用d、 但是
-rpath
LD\u LIBRARY\u PATH
更像是一种黑客行为,如果您试图在未经仔细考虑的情况下将应用程序二进制文件提供给其他人,则会带来其他问题


解决所有这些问题的非黑客方法是确保将新的共享库安装到系统已知的目录中。如果库的现有版本所在的目录是/usr/lib,那么这可能意味着/usr/lib

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

但是,这会干扰软件包管理,因此在通过软件包管理器进行更新时会导致其他问题。因此,您可能需要先卸载系统libpcap软件包,或者通常寻找在CentOS上更换系统软件包的正确方法