僅預處理
# gcc -E main.c > main.txtc++
僅預處理,而且不刪除註釋
# gcc -C -E main.c > main.txtgit
僅預處理和編譯,生成main.s彙編代碼
# gcc -S main.cgithub
僅預處理,編譯和彙編,生成main.o文檔
gcc -c main.c優化
定製輸出目標文件
# gcc main.c -o hello
# gcc -S main.c -o main.asmspa
使用管道代替編譯中的臨時文件
# gcc -pipe -o hello main.c調試
開啓ANSI C特性,與ANSI C不兼容的特性都會產生錯誤提示
禁用asm,inline,tyepof等關鍵字及一些預處理宏
# gcc -ansi main.ccode
# 使用ISO C89做爲標準來編譯程序, 等同於:-ansi
# gcc -std=c89 main.cblog
# 使用ISO C89和GNU的一些擴展做爲標準來編譯程序
# gcc -std=gnu89 main.cip
# 使用ISO C99做爲標準來編譯程序
# gcc -std=c99 main.c文檔
# 使用ISO C99和GNU的一些擴展做爲標準來編譯程序
# gcc -std=gnu99 main.c
# 使用 C++98做爲標準來編譯程序
# g++ -std=c++98 main.cpp
至關於#include <foo.h>
# gcc main.c -include ./foo.h
至關於#define NDEBUG
# gcc -DNDEBUG main.c
至關於#define PI=3.14
# gcc -DPI=3.14 main.c
至關於#undef PI
# gcc -UPI main.c
先在DIR指定目錄查找,而後在當前目錄查找,最後在缺省的頭文件目錄查找
# gcc -IDIR main.c
取消前一個參數的功能 -l-
# gcc -IDIR -l- main.c
不在標準頭文件目錄查找
# gcc -IDIR -nostdinc main.c
指定庫路徑
# gcc -LDIR main.c
指定依賴庫
# gcc -lpthread main.c
生成文件關聯信息,分析文件依賴關係
# gcc -M main.c
# gcc -MM main.c (忽略#include <file>所依賴的關係)
優化選項
-O0 無優化
-O1 缺省值,簡寫:-O
-O2
-O3 最高級優化
# gcc -O3 main.c
產生調試信息
# gcc -g main.c
儘量生成符合gdb的調試信息
# gcc -ggdb main.c
使用靜態連接方式生成可執行文件
# gcc -static main.c
儘可能使用動態庫(當靜態庫與動態庫同名時,GCC將優先使用動態庫)
# gcc -shared main.c
# gcc -shared -fPIC main.c (生成位置無關目標文件)
開啓大部分告警信息
# gcc -Wall main.c
使告警信息變成錯誤處理,有告警時中止編譯
# gcc -Werror main.c
當一個局部變量遮住了另外一個局部或全局變量,給出告警
# gcc -Wshadow main.c
對合法但值得懷疑的表達式發出警告
# gcc -Wextra main.c
當編譯時不符合ANSI/ISO C標準的地方列出警告
# gcc -pedantic main.c
# gcc -Wall -ansi -pedantic main.c
生成32位機器上的代碼
# gcc -m32 main.c
生成64位機器上的代碼,不能運行在32位環境,適用於x86_64和x64環境
# gcc -m64 main.c
單步生成靜態庫
# gcc -c hello.c -o hello.o
# ar rcs libHello.a hello.o
# gcc main.c -o main -static ./libHello.a
單步生成動態庫
# gcc -shared -fPIC hello.c -o libHello.so
# gcc main.c ./libHello.so -o main
相似執行strip,去除可執行文件中的符號表和重定位信息
# gcc -s main.c
運行時先查找指定庫路徑,而後再查找標準庫路徑
# gcc -Wl, -rpath=DIR1:DIR2 -I. -L. -lpthread main.c
# gcc -Wl, -rpath,DIR1:DIR2 -I. -L. -lpthread main.c
管理員權限下,更新標準庫搜索路徑
# cd XXX_HOME/lib
# pwd >> /etc/ld.so.conf
# /sbin/ldconfig
普通用戶權限下,臨時更新標準庫搜索路徑
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX_HOME/lib
$@ - 目標
$< - 第一個依賴文件
$^ - 全部依賴文件
# Copyright (c) 2015 by Zhang Taian. ALL RIGHTS RESERVED. # Author: Zhang Taian # E-Mail: 1523905949@qq.com # Github: https://github.com/zhangtaian # Create: 2015-11-21 TARGET := XXX NDEBUG := 1 CPP := 0 BINARY := $(TARGET).bin SHARED := lib$(TARGET).so STATIC := lib$(TARGET).a ifeq ($(NDEBUG), 1) CFLAGS += -DNDEBUG LDFLAGS += -O3 else CFLAGS += -DDEBUG CFLAGS += -D_DEBUG CFLAGS += -g LDFLAGS += -O0 endif CFLAGS += -D_REENTRANT CFLAGS += -D_FILE_OFFSET_BITS=64 CFLAGS += -pipe CFLAGS += -W -Wall -Werror -Wshadow -Wextra CFLAGS += -m64 -fPIC #CFLAGS += -std=c++11 #CFLAGS += -std=c89 -pedantic CFLAGS += -I. CFLAGS += -I../3rd/XXX/include #LDFLAGS += -static LDFLAGS += -lpthread LDFLAGS += -L. LDFLAGS += -Wl,-rpath=. #LDFLAGS += -L../3rd/XXX/lib -lXXX SRC_C := $(wildcard *.c) OBJ_C := $(patsubst %.c,%.o,$(SRC_C)) #OBJ_C := $(SRC:%.c=%.o) SRC_CPP := $(wildcard *.cpp) OBJ_CPP := $(patsubst %.cpp,%.o,$(SRC_CPP)) ifeq ($(CPP), 1) CC := g++ OBJ := $(OBJ_CPP) else OBJ := $(OBJ_C) endif %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ %.o: %.cpp $(CXX) $(CFLAGS) -c $< -o $@ .PHONY: all all: $(BINARY) #all: $(BINARY) $(SHARED) $(STATIC) .PHONY: $(BINARY) $(BINARY): $(OBJ) $(CC) $(LDFLAGS) $^ -o $@ .PHONY: $(SHARED) $(SHARED): $(OBJ) $(CC) -shared -fPIC $(LDFLAGS) $^ -o $@ .PHONY: $(STATIC) $(STATIC): $(OBJ) $(AR) -rcs $(LDFLAGS) $^ -o $@ .PHONY: clean clean: -$(RM) $(OBJ) .PHONY: distclean distclean: clean -$(RM) $(BINARY)