2014-01-08 122 views
0

我必須檢查某些庫(libm,libdl)是否存在才能編譯我的庫。lib和帶有autoconf的模塊之間有什麼區別

在我的configure.ac模板文件中,有PKG_CHECK_MODULES宏和PKG_CHECK_LIB宏。

我不明白使用哪一個以及如何使用?

PKG_CHECK_MODULES似乎是最全球性的,因爲它會檢查,如果將整個圖書館存在並PKG_CHECK_LIB只檢查是否一個功能是可訪問的。但是,當我做PKG_CHECK_MODULES([LIBM],[libm],[],[exit -1]),它的存在,我不明白爲什麼。

我想我誤解了一些概念。也許有人可能會引導我參考。

+0

沒有'PKG_CHECK_LIB'這樣的東西。 – DanielKO

回答

2

PKG_CHECK_MODULES用於與具有pkg-config元數據的包集成。該元數據通常存儲在foo.pc(對於包foo)的文件中,位於/usr/share/pkgconfig之類的某個位置。該文件將說明foo及其相關文件(頭文件,庫,可執行文件,數據等)的實際安裝位​​置。

但是,大多數軟件包不使用pkg-config系統,包括標準C庫,其中libmlibdl是。所以你需要使用AC_CHECK_LIB來測試它們。

1

你似乎混淆,所以我會去有點切線的位置:


曾幾何時,有X11;有許多不兼容的X11安裝。要編寫針對每個變體編譯的代碼,人們會編寫瘋狂的autoconf宏,試圖自動找出之前要列出的庫,後續列出的庫以及之間需要的額外標記。 (見AC_PATH_XAC_PATH_XTRA)。

有些人嘗試了更明智的方法,並且編寫了shell腳本以安裝在庫中;所以你只需打電話給他們,他們會給你所有特定庫所需的魔法標誌。 (見sdl-configwx-configfreetype-configmotif-config等)

然後從freedesktop.org鄉親決定是爲大家維護,基本上做同樣的事情這些腳本是件苦差事,所以他們寫了一個工具(pkg配置)可以像所有這些*-config腳本一樣工作,並且不需要運行shell(針對Windows用戶)。所有庫作者需要做的是將元數據寫入*.pc文件中,並沿庫中安裝它們。


關於autoconf的,它具有低級別的方法來捅系統周圍,以瞭解該庫:AC_CHECK_HEADERS,看是否標頭是存在並且可用,並AC_CHECK_LIB,看看它是否可以鏈接反對他們。

pkg-config工具帶有用於autoconf的便利宏,主要是PKG_CHECK_MODULES,它不是四處查找,而是簡單地查找庫可能安裝的元數據。


關於libm,libdl,如ldav1s所說,它們是系統的一部分;有些系統需要與libm(提供數學函數)和/或libdl(提供動態加載共享對象的函數)的顯式鏈接。通常,其他工具(如gcc或libtool)負責與它們進行鏈接。不幸的是,它們沒有提供pkg-config的元數據,所以如果你必須手動找到它們,你必須捅過舊的AC_CHECK_HEADERSAC_CHECK_LIB宏才能找到它們。

相關問題