1. 程式人生 > >Linux環境下原始碼編譯和執行常用的兩個命令:pkg-config和ldconfig

Linux環境下原始碼編譯和執行常用的兩個命令:pkg-config和ldconfig

        最近一段時間在研究linux伺服器叢集的相關知識,打算基於corosync和pacemaker來搭建一個linux高可用叢集,

通過編譯原始碼包來了解其依賴的動態庫,在編譯的過程中遇到一些問題,總結一些,供大家以後參考(很通用哦):

       我們知道,linux編譯原始碼包基本步驟無非是:configure,make,make install三部曲;configure過程中可能會遇

到無法找到某些標頭檔案和動態庫;原因有兩個:

       (1)系統壓根就沒有這些標頭檔案和動態庫。(locate XXXX.h/so 未找到)

       (2)已經安裝相關的標頭檔案和動態庫。但未將標頭檔案和動態庫拷貝到標準路徑下。

對於第(2)中情況,我們可以通過配置PKG_CONFIG_PATH環境變數來解決標頭檔案和動態庫無法找到的問題;

         先介紹一下pkg-config的用法:

          pkg-config命令經常被用於Makefile檔案用來找尋標頭檔案和動態連結庫,最常用的方式:

[[email protected] ~]# pkg-config --cflags --libs libcfg
 -I/ext/corosync/include  -L/ext/corosync/lib -lcfg 

上述命令用於返回libcfg.so的連結路徑,以及相關的標頭檔案路徑。

         pkg-config是如何找到libcfg.so的存放路徑和標頭檔案的存放路徑的呢?pkg-config會查詢libcfg.pc檔案;該檔案存

放了標頭檔案和動態連結庫的路徑存放資訊;libcfg.pc檔案內容如下:

prefix=/ext/corosync
exec_prefix=${prefix}
libdir=/ext/corosync/lib
includedir=${prefix}/include

Name: cfg
Version: 1.3.3
Description: cfg
Requires: 
Libs: -L${libdir} -lcfg
Cflags: -I${includedir}
       那麼pkg-config如何找到libcfg.pc檔案的呢?相信同學們肯定猜到了,就是PKG_CONFIG_PATH環境變數;一般情況

下動態庫都存放在安裝目錄下的lib目錄下,libcfg.so存放在/ext/corosync/lib/目錄下;同時該目錄下有一個pkgconfig目

錄,相信經常編譯原始碼的同學對這個目錄並不陌生,該目錄下存放的就是*.pc檔案,存放著我們的動態庫和標頭檔案

路徑元資料。通過設定PKG_CONFIG_PATH為我們/ext/corosync/lib/pkgconfig;pkg-config命令就可以輕鬆找到*.pc

檔案,進而找到路徑資訊。

好了,經過上述設定後,configure便可以順利的生成Makefile檔案了。make,make install就可以了。

到此為止,我們僅僅完成了程式的編譯和連結,還有最後一步,程式執行;程式執行需要載入動態連結庫並執行,也

需要找尋動態連結庫的路徑,pkg-config僅負責編譯連結時標頭檔案和動態連結庫的查詢。對於程式執行時載入動態鏈

接庫,pkg-config就無能為力了,此時需要用到ldconfig命令,該命令為程式執行時提供動態連結庫的執行時繫結,通

過載入/etc/ld.so.conf下的路徑資訊,生成動態庫的快取/etc/ld.so.cache,為程式執行時提供動態庫的連結;通過

ldconfig -p檢視動態連結庫快取資訊。因此需要將我們的動態連結庫路徑新增到/etc/ld.so.conf中,執行ldconfig更新

cache,就大功告成了。