2013-10-15 94 views
0

我在查找https://trac.mpich.org/projects/mpich/ticket/1888的分辨率。配置測試正確地找到libpciaccess.so,這是一個符號鏈接,指向不存在的第二個符號鏈接而不是正確的符號鏈接,因此所需共享對象的最終解析失敗。是否有配置測試檢測無效的符號鏈接?

$會/usr/lib64/libpciaccess.so*

lrwxrwxrwx 1根部22 2012-09-06 11點37 /usr/lib64/libpciaccess.so - > libpciaccess.so.0.10.2

lrwxrwxrwx 1根部22 2012-04-05 12:25 /usr/lib64/libpciaccess.so.0 - > libpciaccess.so.0.10.8

-rwxr-XR-X 1根35K 2011- 10-10 16:16 /usr/lib64/libpciaccess.so.0.10.8

有誰知道使用configure檢查壞符號鏈接分辨率的好方法嗎?

謝謝!

回答

1

如果使用AC_CHECK_LIB,配置測試會將測試程序鏈接到庫。如果符號鏈接是孤立的,那麼測試將失敗。但是,由於該軟件包使用pkg-config,因此AC_CHECK_LIB幾乎肯定不會被調用。這是PKG_CHECK_MODULES的一個基本缺陷;配置腳本依賴於用戶通過*.pc文件提供的信息,但不驗證該數據。這是一個混亂,我從來沒有嘗試過(因爲我相信正確的解決方案是停止使用PKG_CHECK_MODULES),但似乎你可以簡單地調用PKG_CHECK_MODULES並立即追加到LDFLAGS,然後調用AC_CHECK_LIB來驗證標誌。這至少會給配置腳本一個失敗的機會,而不是構建失敗。

--edited,省略了後面的咆哮,這是保留歷史準確性和因爲有時咆哮是一件好事,而且很難知道什麼時候.--

試圖通過允許特定庫路徑顛覆的autoconf通過--with-libname標誌添加標誌是一種註定失敗的策略。要搜索庫的路徑列表旨在由用戶通過LDFLAGS指定給配置腳本,並嘗試讓鏈接器以不同順序選擇搜索樹中的各種庫,這超出了autoconf的範圍。

換句話說,它看起來像這個用戶的版本0.10.8安裝在版本0.10.2之前的鏈接器的搜索路徑中,所以配置腳本是相當正確地鏈接到0.10.8版本。包的維護者通過提供一個--with-libname標誌來僞裝提供比鏈接器允許的更多功能。另外,用戶通過提供不能準確反映系統狀態的軟件包配置文件來欺騙配置腳本,而維護人員通過使用PKG_CHECK_MODULES來鼓勵這種錯誤。這是爲什麼pkg-config不應與automake結合使用的又一個例子。當維護者停止對用戶說謊時,該錯誤將消失,並且用戶停止對配置腳本說謊。換句話說,用戶需要得到以他們*.pc文件,並沒有什麼維護者可以幫忙超越而中止pkg-config自己放錯地方的依賴

爲了進一步澄清,該configure腳本正確地確定所需的庫可用。但是,構建是由用戶的.pc文件中取得的數據驅動的,而這些數據未由配置腳本檢查。這是由於使用PKG_CHECK_MODULES而產生的不匹配,也是程序包維護者不應該使用PKG_CHECK_MODULES的一個重要原因。修復方法是讓用戶修復.pc文件。