天天看點

通用makefile 檔案

## c/c++ 代碼編譯Makefile
########################正常配置##################################################
##目标檔案
TARGET = server

##安裝目錄
INSTALL_DIR = /opt/

##包含頭檔案路徑
# -I/xx/xx/include
INC_DIR = -I/usr/include/mysql -I/usr/include/libxml2

##依賴庫
LIB_DIR = -L/usr/lib64/mysql 
LIB_DEPENDS = -lmysqlclient -lcurl -lxml2

##編譯選項
CFLAGS = -Wall -O -g
# -Wall  輸出所有告警
# -O     在編譯時進行優化
# -g     編譯debug版本

######################################################################################
##編譯器選用
CC = gcc
XX = g++

##wildcard通配符函數,産生一個所有.c .cpp檔案清單
C_SRC = $(wildcard *.c)
CXX_SRC = $(wildcard *.cpp)

##産生一個所有.c .cpp檔案 對應的.o檔案清單
##把所有.c替換成.o
#C_OBJS = $(C_SRC:%.c=%.o)
C_OBJS = $(subst .c,.o,$(C_SRC))
#CXX_OBJS = $(CXX_SRC:%.cpp=%.o)
CXX_OBJS = $(subst .cpp,.o,$(CXX_SRC))
ALL_OBJ = $(C_OBJS) $(CXX_OBJS)

##把所有c檔案編譯生成.o檔案
## $< --第一個依賴檔案;$@ --目标檔案
%.o:%.c
	$(CC) $(CFLAGS) -c $< -o $@ $(INC_DIR)

##把所有cpp檔案編譯生成.o檔案
%.o:%.cpp
	$(XX) $(CFLAGS) -c $< -o $@ $(INC_DIR)

##目标檔案,依賴OBJS中的.o檔案
##all--僞目标,$^--所有依賴檔案
all: $(TARGET)
$(TARGET): $(ALL_OBJ)
	$(XX) $^ -o $(TARGET) $(INC_DIR) $(LIB_DIR) $(LIB_DEPENDS)
	chmod a+x $(TARGET)

##安裝指令	
install: all
	mkdir -p $(INSTALL_DIR)
	cp -R $(TARGET) $(INSTALL_DIR)
	
##執行make clean操作
clean:
	rm -rf *.o  $(TARGET)

##指定哪些是僞目标,作用防止有這樣的檔案存在沖突,導緻makefile不執行
.PHONY: all clean distclean install
           

繼續閱讀