Makefile學習筆記

僅預處理
# 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)
相關文章
相關標籤/搜索