1. 程式人生 > >makefile的選項CFLAGS、CPPFLAGS、LDFLAGS和LIBS的區別

makefile的選項CFLAGS、CPPFLAGS、LDFLAGS和LIBS的區別

LDFLAGS是選項,LIBS是要連結的庫。都是餵給ld的,只不過一個是告訴ld怎麼吃,一個是告訴ld要吃什麼。

網上不難搜尋到上面這段話。不過“告訴ld怎麼吃”是什麼意思呢?

看看如下選項:

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib

LIBS = -lmysqlclient -liconv

這就明白了。LDFLAGS告訴連結器從哪裡尋找庫檔案,LIBS告訴連結器要連結哪些庫檔案。不過使用時連結階段這兩個引數都會加上,所以你即使將這兩個的值互換,也沒有問題。


說到這裡,進一步說說LDFLAGS指定-L雖然能讓連結器找到庫進行連結,但是執行時連結器卻找不到這個庫,如果要讓軟體執行時庫檔案的路徑也得到擴充套件,那麼我們需要增加這兩個庫給"-Wl,R"

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

如 果在執行./configure以前設定環境變數export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意設定環境變數等號兩邊不可以有空格,而且要加上引號哦(shell的用法)。那麼執行configure以後,Makefile將會設定這個選項, 連結時會有這個引數,編譯出來的可執行程式的庫檔案搜尋路徑就得到擴充套件了。

------------------------------------------------------------------------------------------------------------------------

PS:-Wl,R在GraphicsMagick環境下,用為-R, 也就是LDFLAGS = -L/var/xxx/lib -R/var/xxx/lib

CFLAGS 或 CPPFLAGS的用法 CPPFLAGS='-I/usr/local/libjpeg/include -I/usr/local/libpng/include'