我想在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
但是当我尝试链接libpcap共享库(使用-lpcap
链接器标志)时,我的应用程序链接到旧版本的libpcap库(使用pcap_lib_version()
API调用验证。
为了与新的libpcap库建立链接,我需要做些什么?
提前致谢
答案 0 :(得分:5)
默认情况下,未指定--prefix
或其他安装位置选项的配置将在 / usr / local / lib 中安装新的libpcap。据推测,您试图覆盖的旧版本是CentOS系统,而 / usr / lib 也是如此。
因此,链接器似乎在 / usr / local / lib 之前搜索 / usr / lib 。
通过将-Wl,-Map,foo.map
添加到链接应用程序的GCC命令,并为libpcap
获取生成的 foo.map 文件,您可以确切地看到链接到哪个libpcap }。
您可以通过查看(两者)
的输出来查看链接器正在使用的库搜索路径gcc -print-search-dirs | grep ^libraries
ld --verbose | grep SEARCH_DIR
如果 / usr / lib 出现在 / usr / local / lib 之前,您可以将-L/usr/local/lib
添加到您的链接命令中以重新排序并获取您的新图书馆。但真的那是一个黑客。
所有这些都是针对链接时出现问题的情况。根据此共享库的版本化方式,在动态链接期间运行应用程序时可能会出现真正的问题。或者两者兼而有之。
在应用程序上运行ldd时,您看到为libpcap列出了什么路径?使用-L/usr/local/lib
构建应用程序时该怎么办?
ldd yourapp
要强制动态链接器在 / usr / local / lib 中找到您的共享库,您可能希望查看链接器的-rpath
选项或LD_LIBRARY_PATH
环境变量。将-L/usr/local/lib -Wl,-rpath,/usr/local/lib
添加到link命令肯定会确保使用新版本的库。但是-rpath
和LD_LIBRARY_PATH
都更像是一个黑客攻击,如果你试图将你的应用程序二进制文件交给其他人而不经过仔细考虑就会引入其他问题。
所有这一切的非hackish方法是确保您将新的共享库安装到系统已知的目录中。这可能意味着 / usr / lib ,如果那是现有版本的库。
您可以在构建libpcap时通过向configure命令添加--prefix=/usr
来执行此操作。在那里安装新的libpcap后,您应该能够编译并链接您的应用程序,而无需任何额外的链接器选项。
但是这会干扰程序包管理,因此在通过程序包管理器进行更新时会导致其他问题。因此,您可能希望首先卸载系统libpcap软件包,或者通常查看在CentOS上替换系统软件包的正确方法。