1. 程式人生 > >makefile與configure的LDFLAG、CFLAG、LIBS用法

makefile與configure的LDFLAG、CFLAG、LIBS用法

在使用Makefile進行編譯或者使用configure檔案生成makefile的過程中,經過會涉及LDFLAGS、CFLAGS、prefix等等引數。其實這些引數最終都是傳遞給gcc,來對編譯產生影響。

作個整理介紹:
–prefix 指定安裝目錄。(gcc一定對應安裝?)

在LINUX中的原始碼編譯程式都遵守一個規則,就是以指定的目錄為相對目錄,安裝程式,例如,安裝前./configure –prefix=/ABC
那麼,安裝後,在/ABC下就有對於這個程式的/ABC/include該程式的標頭檔案目錄 /ABC/etc該程式的配置目錄,/ABC/bin該程式應用目錄等,這時,我們直接打應用程式名就不可能執行得起來,因為PATH變數裡沒有指向/ABC/bin應用目錄,所以執行要用絕對路徑/ABC/bin/application_name。
所以通常我們./configure的時候,預設是–prefix=/usr,這樣的話,本程式的配置檔案就會裝到/usr/etc,應用檔案就會安裝到/usr/bin,本程式的私有庫也會安裝到/usr/lib等等,,我們也不用設定PATH就可以直接用了
用法示例:
./configure –prefix=”/opt/aaa/”

CFLAGS

指定標頭檔案(.h檔案)的路徑,如:CFLAGS=-I/usr/include -I/path/include。如果你的標頭檔案不處於gcc預設的路徑之中,就需要使用此引數指定。那麼gcc預設的搜尋標頭檔案的路徑是什麼呢?
使用 gcc -v -x c -E /dev/null 檢視

[email protected]:~/workspace/test1$ gcc -v -x c -E /dev/null
......

#include "..." search starts here:


#include <...> search starts here:
/usr/lib/gcc/i686-linux-gnu/6/include /usr/local/include /usr/lib/gcc/i686-linux-gnu/6/include-fixed /usr/include/i386-linux-gnu /usr/include .......

LDFLAGS

gcc 等編譯器會用到的一些優化引數,也可以在裡面指定非預設路徑的庫檔案的位置。用法:LDFLAGS=”-L/usr/lib -L/path/to/your/lib”。
使用如下命令檢視預設庫檔案的搜尋位置:

[email protected]:~/workspace/test1$ gcc -print-search-dirs
install
/usr/lib/gcc/i686-linux-gnu/6
/ programs =/usr/lib/gcc/i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/ /usr/lib/gcc/i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/bin/i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/bin/i386-linux-gnu/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/bin/ libraries =/usr/lib/gcc/i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/i386-linux-gnu/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/../lib/ /usr/lib/gcc/i686-linux-gnu/6/../../../i686-linux-gnu/6/ /usr/lib/gcc/i686-linux-gnu/6/../../../i386-linux-gnu/ /usr/lib/gcc/i686-linux-gnu/6/../../../../lib/ /lib/i686-linux-gnu/6/ /lib/i386-linux-gnu/ /lib/../lib/ /usr/lib/i686-linux-gnu/6/ /usr/lib/i386-linux-gnu/ /usr/lib/../lib/ /usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/ /usr/lib/gcc/i686-linux-gnu/6/../../../ /lib/ /usr/lib/

LIBS

告訴連結器要連結哪些庫檔案,如要引入pthread和iconv,則寫LIBS =” -lpthread -liconv”

PKG_CONFIG_PATH


其他:
參考:
3.3 Linux標頭檔案和庫的搜尋路徑

編譯時,標頭檔案的搜尋路徑的配置有以下方法:
1. 編譯時使用“gcc –I incpath”指定標頭檔案搜尋路徑。
2. 編譯時使用環境變數 “C_INCLUDE_PATH”指定標頭檔案搜尋路徑。
3. 編譯時使用gcc的預設標頭檔案搜尋路徑

連結時,庫的搜尋路徑的配置有以下方法:
1. 使用 “gcc –Llibpath –llibname”指定連結庫搜尋路徑。
2. 使用環境變數“LIBRARY_PATH” 指定連結庫搜尋路徑。
3. 使用ld連線指令碼中的 “SEARCH_DIR” 指定連結庫搜尋路徑

執行時,庫的搜尋路徑的配置有以下方法:
1. 編譯時使用 “gcc –Wl,-rpath”指定執行時動態連結庫的搜尋路徑,硬編碼進ELF檔案 “RPATH”選項。
2. 編譯時使用環境變數 “LD_RUN_PATH”指定執行時動態連結庫的搜尋路徑,硬編碼進ELF檔案 “RPATH”選項。
3. 使用環境變數 “LD_LIBRARY_PATH”指定執行時動態連結庫的搜尋路徑。
4. 使用配置檔案“/etc/ld.so.conf”指定執行時動態連結庫的搜尋路徑。
5. 使用執行時動態連結庫的預設搜尋路徑“/lib、/usr/lib”。