[英]What is the difference between a lib and an module with autoconf
我必須檢查某些庫(libm,libdl)是否存在才能編譯我的庫。
在我的configure.ac模板文件中,有PKG_CHECK_MODULES
宏和PKG_CHECK_LIB
宏。
我不知道該使用哪個以及如何使用?
PKG_CHECK_MODULES
似乎是最全局的,因為它檢查是否存在整個庫,而PKG_CHECK_LIB
僅檢查是否可以訪問一個函數……但是當我執行PKG_CHECK_MODULES([LIBM],[libm],[],[exit -1])
,它存在,我不明白為什么。
我想我誤解了一些概念。 也許有人可以引導我參考。
PKG_CHECK_MODULES
用於與具有pkg-config元數據的軟件包集成。 該元數據通常存儲在/usr/share/pkgconfig
類的名為foo.pc
(用於foo
包)的文件中。 該文件將說明foo
及其相關文件(頭文件,庫,可執行文件,數據等)的實際安裝位置。
但是,大多數軟件包都不使用pkg-config
系統,包括標准C庫,即libm
和libdl
所在的庫。 因此,您需要使用AC_CHECK_LIB
對其進行AC_CHECK_LIB
。
您似乎很困惑,所以在這里我要講一點切線:
從前,有X11; X11的安裝不兼容。 為了編寫可針對每個變體進行編譯的代碼,人們會編寫瘋狂的autoconf宏,以嘗試自動找出之前要列出的庫,之后要列出的庫以及之間需要額外的標志。 (請參閱AC_PATH_X
和AC_PATH_XTRA
)。
有些人嘗試了更明智的方法,並編寫了一些shell腳本以在這些庫中安裝; 因此,您只需調用它們,它們就會為您提供該特定庫所需的所有魔術標記。 (請參閱sdl-config
, wx-config
, freetype-config
, motif-config
等)
然后,來自freedesktop.org的人們認為,維護那些執行相同操作的腳本對於每個人來說都是一件繁瑣的事情,因此他們編寫了一個工具(pkg-config),該工具可以像所有*-config
腳本一樣工作,並且不需要要運行的外殼程序(適用於Windows用戶)。 庫作者需要做的就是將元數據寫入*.pc
文件,然后將它們安裝在庫中。
關於autoconf,它具有在系統中查找AC_CHECK_HEADERS
庫的低級方法: AC_CHECK_HEADERS
,查看標頭是否存在和可用,以及AC_CHECK_LIB
,查看是否可以針對它們進行鏈接。
pkg-config工具帶有用於autoconf的便捷宏,主要是PKG_CHECK_MODULES
,它不是在四處尋找,而只是在尋找庫可能已安裝的元數據。
關於ldav1所說的libm,libdl,它們是系統的一部分。 一些系統需要針對libm(提供數學函數)和/或libdl(提供動態加載共享對象的函數)的顯式鏈接。 通常,其他工具(例如gcc或libtool)會負責與它們鏈接。 不幸的是,它們沒有pkg-config的元數據,因此,如果您必須手動查找它們,則必須使用舊的AC_CHECK_HEADERS
和AC_CHECK_LIB
宏來查找它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.