簡體   English   中英

lib和使用autoconf的模塊有什么區別

[英]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庫,即libmlibdl所在的庫。 因此,您需要使用AC_CHECK_LIB對其進行AC_CHECK_LIB

您似乎很困惑,所以在這里我要講一點切線:


從前,有X11; X11的安裝不兼容。 為了編寫可針對每個變體進行編譯的代碼,人們會編寫瘋狂的autoconf宏,以嘗試自動找出之前要列出的庫,之后要列出的庫以及之間需要額外的標志。 (請參閱AC_PATH_XAC_PATH_XTRA )。

有些人嘗試了更明智的方法,並編寫了一些shell腳本以在這些庫中安裝; 因此,您只需調用它們,它們就會為您提供該特定庫所需的所有魔術標記。 (請參閱sdl-configwx-configfreetype-configmotif-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_HEADERSAC_CHECK_LIB宏來查找它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM