GCC入门
目標文件的鏈接次序
規范的連接次序為調用者在前,定義者在后。
GNU make基于時間戳編譯源文件。
是否考慮次序取決于文件類型。
鏈接外部庫
靜態庫。擴展名為“.a”,是通過GNU ar工具利用目標文件創建出來的。連接器會解析函數等的引用。
標準系統庫通常存放路徑為/usr/lib或/lib
gcc -v可以查看編譯鏈接的詳細信息
gcc -Wall main.c -lm -o calc
“-lNAME”相當于“libNAME.a”
外部庫的鏈接順序,規則同目標文件的鏈接次序。
對于引用,不顯式聲明(如,不不包含頭文件),仍可能生成可執行程序。但運行時可能產生未知的錯誤。
搜索路徑
“-I”指定頭文件路徑,“-L”指定庫文件路徑,此方式優先級最高(相比較設置環境變量的方式而言)
在源代碼中,不要使用絕對路徑包含頭文件,會影響程序的可移植性。
搜索路徑的環境變量
通過文件“.bash_profile”設置編譯時頭文件和庫文件的搜索路徑
通過設置編譯環境變量C_INLCUDE_PATH或CPLUS_INLCUDE_PATH
通過設置鏈接環境變量LIBRARY_PATH
用ar生成庫
生成庫文件 ar cr libxxx.a xxx.o yyy.o
查看庫文件中有多少個目標文件 ar -t libNAME.a
動態庫和靜態庫
靜態庫文件后綴為“.a”,動態庫文件后綴為“.so”
動態庫搜索路徑的環境變量為:LD_LIBRARY_PATH
預處理
選項“-D”定義宏,使用方法為 “-DNAME=VALUE”,不指定值,默認為1
cpp預定義的宏,查看方法為 cpp -DM /dev/null
選項“-E”,僅預處理,不編譯
調試
選項“-g”,用于生成調試信息
查看core dump文件允許的大小,ulimit -c
core dump大小不受限制,執行ulimit -c unlimited
優化選項
“-Olevel”,level取值為0-3
“-funroll-loops”,將函數中的循環展開
優化選項和“-g”可同時使用
編譯器工作步驟
預處理(宏展開,頭文件展開)
示例:cpp hello.c > hello.i
編譯(將源代碼轉換為匯編代碼)
示例:gcc -Wall -S hello.i (生成hello.s)
匯編(匯編代碼轉換為機器碼)
示例:as hello.s -o hello.o
鏈接(創建最終的可執行程序)
示例:gcc hello.o
識別文件
file命令
各種屬性:
ELF--可執行文件
LSB--least significant byte
not stripped--(符號表)未剝離
nm命令:查看符號表
T -- 表明函數在目標文件中定義
U -- 表示函數未被定義,需要鏈接外部的目標文件
ldd命令:查看可執行程序依賴的動態庫
示例:ldd a.out
?
轉載于:https://www.cnblogs.com/collapsar/p/9196101.html
總結
- 上一篇: 博客设计
- 下一篇: bzoj2049 [Sdoi2008]C