我正在寻找https://trac.mpich.org/projects/mpich/ticket/1888的解决方案。配置测试正确地找到了libpciaccess.so,这是一个指向不存在的第二个符号链接而不是正确的符号链接的符号链接,因此所需共享对象的最终解析失败。
$ ll /usr/lib64/libpciaccess.so *
lrwxrwxrwx 1 root 22 2012-09-06 11:37 /usr/lib64/libpciaccess.so - > libpciaccess.so.0.10.2
lrwxrwxrwx 1 root 22 2012-04-05 12:25 /usr/lib64/libpciaccess.so.0 - > libpciaccess.so.0.10.8
-rwxr-xr-x 1 root 35K 2011-10-10 16:16 /usr/lib64/libpciaccess.so.0.10.8
有没有人知道使用configure检查错误的符号链接解析的好方法?
谢谢!
答案 0 :(得分:2)
如果使用AC_CHECK_LIB
,配置测试会将测试程序链接到库。如果符号链接是孤立的,则该测试将失败。但是,由于此程序包使用pkg-config,因此几乎肯定不会调用AC_CHECK_LIB
。这是PKG_CHECK_MODULES
的根本缺陷; configure脚本依赖于用户通过*.pc
文件提供的信息,但未验证该数据。这有点像kludge,我从来没有尝试过(因为我相信正确的解决方案是停止使用PKG_CHECK_MODULES
),但似乎你只需调用PKG_CHECK_MODULES
并立即附加到LDFLAGS然后调用AC_CHECK_LIB来验证标志。这至少会使配置脚本失败,而不是让构建失败。
- 编辑以省略下面的咆哮,这是为了保持历史准确性,因为有时咆哮是好事,而且很难知道什么时候.--
尝试通过允许通过--with-libname
标志添加特定库路径来破坏autoconf是一种注定要失败的策略。要搜索库的路径列表是由用户通过LDFLAGS指定给配置脚本的,并且尝试让链接器以不同的顺序选择搜索树中的各种库超出了autoconf的范围。 / p>
换句话说,看起来这个用户在版本0.10.2之前的链接器搜索路径中安装了0.10.8版本,因此configure脚本非常正确地链接到0.10.8版本。包的维护者通过提供--with-libname
标志来向用户说谎,这些标志假装提供比链接器允许的更多功能。此外,用户通过提供不能准确反映系统状态的软件包配置文件来欺骗配置脚本,维护者通过使用PKG_CHECK_MODULES来鼓励虚假。这是为什么pkg-config不应与automake一起使用的另一个例子。当维护者停止向用户说谎时,该错误将消失,并且用户停止对配置脚本撒谎。换句话说,用户需要按顺序获取他们的*.pc
文件,除了停止他们对pkg-config
为了进一步说明,configure
脚本正确地确定了必要的库可用。但是,构建是由用户.pc
文件中的数据驱动的,配置脚本未检查这些数据。这是由于使用PKG_CHECK_MODULES而产生的不匹配,并且是阻止软件包维护者使用PKG_CHECK_MODULES的重要原因。该修复程序是供用户修复其.pc
文件。