Makefile選項CFLAGS,LDFLAGS,LIBS


 

我們用gcc編譯程序時,可能會用到“-I”(大寫i),“-L”(大寫l),“-l”(小寫l)等參數,例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
  • 1

上面這句表示在編譯hello.c時:

-I /home/hello/include表示將/home/hello/include目錄作為第一個尋找頭文件的目錄,尋找的順序是:/home/hello/include-->/usr/include-->/usr/local/include

-L /home/hello/lib表示將/home/hello/lib目錄作為第一個尋找庫文件的目錄,尋找的順序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

-lworld表示在上面的lib的路徑中尋找libworld.so動態庫文件(如果gcc編譯選項中加入了“-static”表示尋找libworld.a靜態庫文件)

Makefile選項CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用於 C 編譯器的選項,CXXFLAGS 表示用於 C++ 編譯器的選項。這兩個變量實際上涵蓋了編譯和匯編兩個步驟。

  • CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS=-I /usr/include -I /path/include。同樣地,安裝一個包時會在安裝路徑下建立一個include目錄,當安裝過程中出現問題時,試着把以前安裝的包的include目錄加入到該變量中來。
  • LDFLAGS:gcc 等編譯器會用到的一些優化參數,也可以在里面指定庫文件的位置。用法:LDFLAGS=-static -L /usr/lib -L /path/to/your/lib。每安裝一個包都幾乎一定的會在安裝目錄里建立一個lib目錄。如果明明安裝了某個包,而安裝另一個包時,它愣是說找不到,可以抒那個包的lib路徑加入的LDFALGS中試一下。
  • LIBS:告訴鏈接器要鏈接哪些庫文件,如LIBS = -lpthread -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
  • 1

如果在執行./configure以前設置環境變量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意設置環境變量等號兩邊不可以有空格,而且要加上引號(shell的用法)。那么執行configure以后,Makefile將會設置這個選項,鏈接時會有這個參數,編譯出來的可執行程序的庫文件搜索路徑就得到擴展了。

gcc總體選項列表:
在這里插入圖片描述

gcc的告警和出錯選項如下所示:
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM