linux常用makefile模板
一、通用的編譯c、c++單工程makefile模板。
1、MY_LIBS是添加靜態(tài)庫(kù)選項(xiàng)
2、MY_CFLAGS一般添加include文件路徑,這個(gè)路徑被用在了c和c++文件編譯時(shí),對(duì)c和c++都有效;如果想分開(kāi)控制,請(qǐng)定義兩個(gè)類(lèi)似的變量
3、PROGRAM是最終生成的文件名,默認(rèn)的是文件夾名字,也可自己指定
4、如果一個(gè)項(xiàng)目有多個(gè)工程,在頂層執(zhí)行這個(gè)文件,會(huì)導(dǎo)致進(jìn)入這個(gè)文件夾兩次,第一次產(chǎn)生.d依賴(lài)文件,由于此時(shí).o文件尚未生成,所以什么也沒(méi)做,
第二次進(jìn)入這個(gè)目錄,會(huì)生成o文件,最終連接成可執(zhí)行文件。.d(depend)依賴(lài)文件;如果以后在編譯時(shí),請(qǐng)不要?jiǎng)h除這些.d文件,以后有了改動(dòng),
比如更改了.h文件中的宏變量,則此時(shí)可根據(jù).depend中的依賴(lài)關(guān)系只生成對(duì)應(yīng)的.o文件了。總之,.d文件可要可不要。默認(rèn)的,*.d依賴(lài)文件不刪除。
不需要d文件,將sinclude $(DEPS)注釋掉即可
5、如果源文件在別的目錄,請(qǐng)?jiān)O(shè)置VPATH
#############################################################2
# Generic Makefile for C/C++ Program3
#4
# License: GPL (General Public License)5
# Author: whyglinux <whyglinux AT gmail DOT com>6
# Date: 2006/03/04 (version 0.1)7
# 2007/03/24 (version 0.2)8
# 2007/04/09 (version 0.3)9
# 2007/06/26 (version 0.4)10
# 2008/04/05 (version 0.5)11
#12
# Description:13
# ------------14
# This is an easily customizable makefile template. The purpose is to15
# provide an instant building environment for C/C++ programs.16
#17
# It searches all the C/C++ source files in the specified directories,18
# makes dependencies, compiles and links to form an executable.19
#20
# Besides its default ability to build C/C++ programs which use only21
# standard C/C++ libraries, you can customize the Makefile to build22
# those using other libraries. Once done, without any changes you can23
# then build programs using the same or less libraries, even if source24
# files are renamed, added or removed. Therefore, it is particularly25
# convenient to use it to build codes for experimental or study use.26
#27
# GNU make is expected to use the Makefile. Other versions of makes28
# may or may not work.29
#30
# Usage:31
# ------32
# 1. Copy the Makefile to your program directory.33
# 2. Customize in the "Customizable Section" only if necessary:34
# * to use non-standard C/C++ libraries, set pre-processor or compiler35
# options to <MY_CFLAGS> and linker ones to <MY_LIBS>36
# (See Makefile.gtk+-2.0 for an example)37
# * to search sources in more directories, set to <SRCDIRS>38
# * to specify your favorite program name, set to <PROGRAM>39
# 3. Type make to start building your program.40
#41
# Make Target:42
# ------------43
# The Makefile provides the following targets to make:44
# $ make compile and link45
# $ make NODEP=yes compile and link without generating dependencies46
# $ make objs compile only (no linking)47
# $ make tags create tags for Emacs editor48
# $ make ctags create ctags for VI editor49
# $ make clean clean objects and the executable file50
# $ make distclean clean objects, the executable and dependencies51
# $ make help get the usage of the makefile52
#53
#===========================================================================54

55
## Customizable Section: adapt those variables to suit your program.56
##==========================================================================57

58
# The pre-processor and compiler options.59
MY_CFLAGS =60

61
# The linker options.62
MY_LIBS =63

64
# The pre-processor options used by the cpp (man cpp for more).65
CPPFLAGS = -Wall66

67
# The options used in linking as well as in any direct use of ld.68
LDFLAGS =69

70
# The directories in which source files reside.71
# If not specified, only the current directory will be serached.72
SRCDIRS =73

74
# The executable file name.75
# If not specified, current directory name or `a.out' will be used.76
PROGRAM =77

78
## Implicit Section: change the following only when necessary.79
##==========================================================================80

81
# The source file types (headers excluded).82
# .c indicates C source files, and others C++ ones.83
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp84

85
# The header file types.86
HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp87

88
# The pre-processor and compiler options.89
# Users can override those variables from the command line.90
CFLAGS = -g -O291
CXXFLAGS= -g -O292

93
# The C program compiler.94
#CC = gcc95

96
# The C++ program compiler.97
#CXX = g++98

99
# Un-comment the following line to compile C programs as C++ ones.100
#CC = $(CXX)101

102
# The command used to delete file.103
#RM = rm -f104

105
ETAGS = etags106
ETAGSFLAGS =107

108
CTAGS = ctags109
CTAGSFLAGS =110

111
## Stable Section: usually no need to be changed. But you can add more.112
##==========================================================================113
SHELL = /bin/sh114
EMPTY =115
SPACE = $(EMPTY) $(EMPTY)116
ifeq ($(PROGRAM),)117
CUR_PATH_NAMES = $(subst /,$(SPACE),$(subst $(SPACE),_,$(CURDIR)))118
PROGRAM = $(word $(words $(CUR_PATH_NAMES)),$(CUR_PATH_NAMES))119
ifeq ($(PROGRAM),)120
PROGRAM = a.out121
endif122
endif123
ifeq ($(SRCDIRS),)124
SRCDIRS = .125
endif126
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))127
HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS))))128
SRC_CXX = $(filter-out %.c,$(SOURCES))129
OBJS = $(addsuffix .o, $(basename $(SOURCES)))130
DEPS = $(OBJS:.o=.d)131

132
## Define some useful variables.133
DEP_OPT = $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then \134
echo "-MM -MP"; else echo "-M"; fi )135
DEPEND = $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS)136
DEPEND.d = $(subst -g ,,$(DEPEND))137
COMPILE.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) -c138
COMPILE.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c139
LINK.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)140
LINK.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)141

142
.PHONY: all objs tags ctags clean distclean help show143

144
# Delete the default suffixes145
.SUFFIXES:146

147
all: $(PROGRAM)148

149
# Rules for creating dependency files (.d).150
#------------------------------------------151

152
%.d:%.c153
@echo -n $(dir $<) > $@154
@$(DEPEND.d) $< >> $@155

156
%.d:%.C157
@echo -n $(dir $<) > $@158
@$(DEPEND.d) $< >> $@159

160
%.d:%.cc161
@echo -n $(dir $<) > $@162
@$(DEPEND.d) $< >> $@163

164
%.d:%.cpp165
@echo -n $(dir $<) > $@166
@$(DEPEND.d) $< >> $@167

168
%.d:%.CPP169
@echo -n $(dir $<) > $@170
@$(DEPEND.d) $< >> $@171

172
%.d:%.c++173
@echo -n $(dir $<) > $@174
@$(DEPEND.d) $< >> $@175

176
%.d:%.cp177
@echo -n $(dir $<) > $@178
@$(DEPEND.d) $< >> $@179

180
%.d:%.cxx181
@echo -n $(dir $<) > $@182
@$(DEPEND.d) $< >> $@183

184
# Rules for generating object files (.o).185
#----------------------------------------186
objs:$(OBJS)187

188
%.o:%.c189
$(COMPILE.c) $< -o $@190

191
%.o:%.C192
$(COMPILE.cxx) $< -o $@193

194
%.o:%.cc195
$(COMPILE.cxx) $< -o $@196

197
%.o:%.cpp198
$(COMPILE.cxx) $< -o $@199

200
%.o:%.CPP201
$(COMPILE.cxx) $< -o $@202

203
%.o:%.c++204
$(COMPILE.cxx) $< -o $@205

206
%.o:%.cp207
$(COMPILE.cxx) $< -o $@208

209
%.o:%.cxx210
$(COMPILE.cxx) $< -o $@211

212
# Rules for generating the tags.213
#-------------------------------------214
tags: $(HEADERS) $(SOURCES)215
$(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES)216

217
ctags: $(HEADERS) $(SOURCES)218
$(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES)219

220
# Rules for generating the executable.221
#-------------------------------------222
$(PROGRAM):$(OBJS)223
ifeq ($(SRC_CXX),) # C program224
$(LINK.c) $(OBJS) $(MY_LIBS) -o $@225
@echo Type ./$@ to execute the program.226
else # C++ program227
$(LINK.cxx) $(OBJS) $(MY_LIBS) -o $@228
@echo Type ./$@ to execute the program.229
endif230

231
ifndef NODEP232
ifneq ($(DEPS),)233
sinclude $(DEPS)234
endif235
endif236

237
clean:238
$(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe239

240
distclean: clean241
$(RM) $(DEPS) TAGS242

243
# Show help.244
help:245
@echo 'Generic Makefile for C/C++ Programs (gcmakefile) version 0.5'246
@echo 'Copyright (C) 2007, 2008 whyglinux <whyglinux@hotmail.com>'247
@echo248
@echo 'Usage: make [TARGET]'249
@echo 'TARGETS:'250
@echo ' all (=make) compile and link.'251
@echo ' NODEP=yes make without generating dependencies.'252
@echo ' objs compile only (no linking).'253
@echo ' tags create tags for Emacs editor.'254
@echo ' ctags create ctags for VI editor.'255
@echo ' clean clean objects and the executable file.'256
@echo ' distclean clean objects, the executable and dependencies.'257
@echo ' show show variables (for debug use only).'258
@echo ' help print this message.'259
@echo260
@echo 'Report bugs to <whyglinux AT gmail DOT com>.'261

262
# Show variables (for debug use only.)263
show:264
@echo 'PROGRAM :' $(PROGRAM)265
@echo 'SRCDIRS :' $(SRCDIRS)266
@echo 'HEADERS :' $(HEADERS)267
@echo 'SOURCES :' $(SOURCES)268
@echo 'SRC_CXX :' $(SRC_CXX)269
@echo 'OBJS :' $(OBJS)270
@echo 'DEPS :' $(DEPS)271
@echo 'DEPEND :' $(DEPEND)272
@echo 'COMPILE.c :' $(COMPILE.c)273
@echo 'COMPILE.cxx :' $(COMPILE.cxx)274
@echo 'link.c :' $(LINK.c)275
@echo 'link.cxx :' $(LINK.cxx)276

277
## End of the Makefile ## Suggestions are welcome ## All rights reserved ##278
##############################################################279

280

二、多項(xiàng)目工程(頂層)makefile模板:這里采用遍歷子文件夾,在有Makefile文件的文件夾下執(zhí)行make命令
1、make ver=$(ver)這里是版本控制,比如make ver=r就是release版本,默認(rèn)是debug,
版本控制也需要在子項(xiàng)目的Makefile文件中體現(xiàn),這是由用戶(hù)自己定義控制
2、make默認(rèn)是打開(kāi)w,輸出運(yùn)行makefile之前和之后的信息,可以用--no-print-directory禁止輸出這個(gè)trace信息
例如:如果采用上面的c、c++工程makefile模板,屏幕會(huì)打印進(jìn)出文件夾的信息,通過(guò)這選項(xiàng)可以禁止輸出這些信息。
3、這里檢測(cè)的是各個(gè)文件夾下的Makefile文件是否存在,也可以檢測(cè)其他文件。
# Top Makefile 2
DIR = /software/project #也可以DIR:= `ls .`3
MODULES = $(shell ls $(DIR)) #也可以MODULES:=`pwd`4

5
all : $(MODULES)6
@for subdir in $(MODULES); \7
do \8
if test -f $(DIR)/$$subdir/Makefile;then\9
cd $(DIR)/$$subdir;\10
make ver=$(ver) ;\11
cd $(DIR);\12
fi;\13
done14

15
clean :16
@for subdir in $(MODULES); \17
do \18
if test -f $(DIR)/$$subdir/Makefile;then\19
cd $(DIR)/$$subdir;\20
make --no-print-directory clean ver=$(ver) ;\21
cd $(DIR);\22
fi;\23
done24

25
tags:26
ctags -R27

28

29
.PHONY : all clean distclean tags help30

31

三、多項(xiàng)目工程(頂層)makefile模板,采用路徑來(lái)表示,不用再檢測(cè)是否有makefile文件;這邊版本可以靈活的添加
# Top Makefile for C program2

3
all :4
#version control.default is debug5

6
$(MAKE) ver=$(ver) -C /home/project/baseframe 7
$(MAKE) ver=$(ver) -C /home/project/logic 8
$(MAKE) ver=$(ver) -C /home/project/login 9
$(MAKE) ver=$(ver) -C /home/project/db 10
tags:11
ctags -R12

13
help:14
@echo "=====================A common Makefilefor c programs===================="15
@echo "Copyright (C) 2014"16
@echo "The following targets aresupport:"17
@echo18
@echo " all - (==make) compile and link"19
@echo " obj - just compile, withoutlink"20
@echo " clean - clean target"21
@echo " distclean - clean target and otherinformation"22
@echo " tags - create ctags for vimeditor"23
@echo " help - print help information"24
@echo25
@echo "To make a target, do 'make[target]'"26
@echo "========================= Version2.0 ==================================="27

28
clean :29

30
$(MAKE) ver=$(ver) -C /home/project/baseframe clean31
$(MAKE) ver=$(ver) -C /home/project/logic clean32
$(MAKE) ver=$(ver) -C /home/project/Login clean 33
$(MAKE) ver=$(ver) -C /home/project/db clean 34

35
distclean:36
$(MAKE) -C /home/project/baseframe distclean37
$(MAKE) -C /home/project/logic distclean38
$(MAKE) -C /home/project/Login distclean39
$(MAKE) -C /home/project/db distclean40

41
42
.PHONY : all clean distclean tags help43

四、通用的c、c++混合編譯模板
#2
# c.cpp混合編譯的makefile模板3
#4
#5

6
BIN = liblua.so7
CC = gcc8
CPP = g++9
#系統(tǒng)庫(kù)的包含路徑、庫(kù)列表10
INCS = 11
LIBS = 12
SUBDIRS =13

14
#源文件包含路徑、庫(kù)列表15
SOURCEINC = 16
#17
#18
#maintest.c tree/rbtree.c 多了子目錄,那就直接添加 目錄/*.c即可 所有的源文件-- .c文件列表19
CSRCS = $(wildcard ./*.c )20
CPPSRCS = $(wildcard ./*.cpp)21

22
#23
#24
#所有的.o文件列表25
COBJS := $(CSRCS:.c=.o)26
CPPOBJS := $(CPPSRCS:.cpp=.o)27
#28
#生成依賴(lài)信息 -MM是只生成自己的頭文件信息,-M 包含了標(biāo)準(zhǔn)庫(kù)頭文件信息。29
#-MT 或 -MQ都可以改變生成的依賴(lài) xxx.o:src/xxx.h 為 src/xxx.o:src/xxx.h 當(dāng)然。前面的 src/xxx.o需自己指定30
#格式為 -MM 輸入.c或.cpp 查找依賴(lài)路徑 -MT或-MQ 生成規(guī)則,比如src/xxx.o 31
MAKEDEPEND = gcc -MM -MT32
CFLAGS =33
CPPFLAGS =34

35
#-g 生成調(diào)試信息36
#-pedantic參數(shù)與-ansi一起使用 會(huì)自動(dòng)拒絕編譯非ANSI程序37
#-fomit-frame-pointer 去除函數(shù)框架38
#-Wmissing-prototypes -Wstrict-prototypes 檢查函數(shù)原型39
#針對(duì)每個(gè).c文件的.d依賴(lài)文件列表40
CDEF = $(CSRCS:.c=.d)41
CPPDEF = $(CPPSRCS:.cpp=.d)42

43
PLATS = win32-debug win32-release linux-debug linux-release44
none:45
@echo "Please choose a platform:"46
@echo " $(PLATS)"47

48
win32-debug:49
$(MAKE) all INCS=-I"c:/mingw/include" LIBS=-L"c:/mingw/lib" CFLAGS="-Wall -DWIN32 -DDEBUG -g" CPPFLAGS="-Wall -DWIN32 -DDEBUG -g"50

51
win32-release:52
$(MAKE) all INCS=-I"c:/mingw/include" LIBS=-L"c:/mingw/lib" CFLAGS="-Wall -DWIN32 -DNDEBUG -O2" CPPFLAGS="-Wall -DWIN32 -DNDEBUG -O2"53
54
linux-debug:55
$(MAKE) all INCS=-I"/usr/include" LIBS=-L"/usr/lib" CFLAGS="-fPIC -Wall -DDEBUG -g" CPPFLAGS="-fPIC -Wall -DDEBUG -g" -lpthread56

57
linux-release:58
$(MAKE) all INCS=-I"/usr/include" LIBS=-L"/usr/lib" CFLAGS="-fPIC -Wall -DNDEBUG -O2" CPPFLAGS="-fPIC -Wall -DNDEBUG -O2" -lpthread59

60
all:$(BIN)61

62
#$(OBJS):%.o :%.c 先用$(OBJS)中的一項(xiàng),比如foo.o: %.o : %.c 含義為:試著用%.o匹配foo.o。如果成功%就等于foo。如果不成功,63
# Make就會(huì)警告,然后。給foo.o添加依賴(lài)文件foo.c(用foo替換了%.c里的%)64
# 也可以不要下面的這個(gè)生成規(guī)則,因?yàn)橄旅娴?nbsp;include $(DEF) 就隱含了。此處為了明了,易懂。故留著65
$(COBJS) : %.o: %.c66
$(CC) -c $< -o $@ $(INCS) $(SOURCEINC) $(CFLAGS)67
$(CPPOBJS) : %.o: %.cpp68
$(CPP) -c $< -o $@ $(INCS) $(SOURCEINC) $(CPPFLAGS)69

70
# $@--目標(biāo)文件,$^--所有的依賴(lài)文件,$<--第一個(gè)依賴(lài)文件。每次$< $@ 代表的值就是列表中的71
#72

73
####################################74
#最終鏈接目標(biāo)是.a(靜態(tài)庫(kù))75
$(BIN) : $(COBJS) $(CPPOBJS)76
ar r $@ $(COBJS) $(CPPOBJS) $(LIBS)77
ranlib $(BIN)78
-rm $(COBJS) $(CPPOBJS)79

80
####################################81
#如果不加-fPIC,則加載.so文件的代碼段時(shí),造成每個(gè)使用這個(gè).so文件代碼段的進(jìn)程在內(nèi)核里都會(huì)生成這個(gè).so文件代碼段的copy.每個(gè)copy都不一樣,取決于 這個(gè).so文件代碼段和數(shù)據(jù)段內(nèi)存映射的位置.82
#使用-fPIC,則產(chǎn)生的代碼中,沒(méi)有絕對(duì)地址,全部使用相對(duì)地址,故而代碼可以被加載器加載到內(nèi)存的任意位置,都可以正確的執(zhí)行83
#最終連接目標(biāo)是.so(動(dòng)態(tài)庫(kù))84
#$(BIN) : $(COBJS) $(CPPOBJS)85
#-shared -fPIC-o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)86
#-rm $(COBJS) $(CPPOBJS)87

88
####################################89
#最終鏈接目標(biāo)是可執(zhí)行文件90
$(BIN) : $(COBJS) $(CPPOBJS)91
$(CPP) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)92
-rm $(COBJS) $(CPPOBJS)93
# 鏈接為最終目標(biāo)94

95

96
#引入了.o文件對(duì).c和.h的依賴(lài)情況。以后.h被修改也會(huì)重新生成,可看看.d文件內(nèi)容即知道為何97
#引入了依賴(lài)就相當(dāng)于引入了一系列的規(guī)則,因?yàn)橐蕾?lài)內(nèi)容例如: 目錄/xxx.o:目錄/xxx.c 目錄/xxx.h 也相當(dāng)于隱含的引入了生成規(guī)則98
#故上面不能在出現(xiàn)如: $(OBJS) : $(DEF)之類(lèi)。切記99
#include $(CDEF) $(CPPDEF)100
.PHONY:clean cleanall101

102
#清除所有目標(biāo)文件以及生成的最終目標(biāo)文件103
clean: 104
-rm $(BIN) $(COBJS) $(CPPOBJS)105
#rm *.d106
cleanall:107
-rm $(BIN) $(COBJS) $(CPPOBJS)108

109
五、簡(jiǎn)單makefile模板:只有一個(gè).o文件110
#/***111
#112
#Copyright 2006 bsmith@qq.com113
#114
#Licensed under the Apache License, Version 2.0 (the "License");115
#you may not use this file except in compliance with the License.116
#You may obtain a copy of the License at117
#118
# http://www.apache.org/licenses/LICENSE-2.0119
#120
#Unless required by applicable law or agreed to in writing, software121
#distributed under the License is distributed on an "AS IS" BASIS,122
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.123
#See the License for the specific language governing permissions and124
#limitations under the License.125
#126
#*/127

128
# ============project================129
PROJECT = db130
AUTHOR = bsmith131
HOME = .132
# =================================133

134
# ==============bin===================135
TARGET = ../bin/db_d136
# ===================================137

138
# ========================================139
# ===========這里可以作為工程的include文件夾,所有的頭文件都可以放到這里===#140
IFLAGS = -I"../common/luainclude/" -I"../common/net/" -I"../common/base/" -I"../common/tool/" -I"../common/" -I"../common/tool/mysql/" -I"../common/luainclude/LuaBridge" -I"../common/luainclude/LuaBridge/detail" -I"../common/Act/" -I"../common/luainclude/LLua"141
# ===============config====================142
CC = g++143
CFLAGS = -w -ldl -lrt -Wno-deprecated-declarations144
LFLAGS = ../common/lib/liblxnet.a ../common/lib/libxml.a ../common/lib/libbaseframe.a ../common/lib/libjemalloc.a ../common/lib/liblua52.a -lpthread -lmysqlclient145
# ========================================146
#maintest.c tree/rbtree.c 多了子目錄,那就直接添加 目錄/*.c即可 所有的源文件-- .c文件列表 147
CSRCS = $(wildcard ./*.c ) 148
CPPSRCS = $(wildcard ./*.cpp )149
#所有的.o文件列表 150
COBJS := $(CSRCS:.c=.o) 151
CPPOBJS := $(CPPSRCS:.cpp=.o) 152

153
# args154
# [args] 生成模式. 0代表debug模式, 1代表release模式. make ver=r.155
ifeq ($(ver),r)156
# release157
CFLAGS += -O3158
TARGET = ../bin/db_r159
else160
# debug161
CFLAGS += -g162
endif163

164
# ==================compile====================165
%.o : %.cpp 166
$(CC) -g -c $(CFLAGS) $(IFLAGS) $(LFLAGS) $< -o $@ 167
168
all : bin169

170
bin : $(TARGET)171

172
$(TARGET) : $(OBJS)173
$(CC) $(CPPSRCS) -o $(TARGET) $(OBJS) $(IFLAGS) $(LFLAGS) $(CFLAGS)174

175
install : $(TARGET)176
@cp $(TARGET) $(HOME)/bin/177
@ln -s $(HOME)/bin/$(TARGET) $(HOME)/bin/$(LINK) 178
179
clean :180
@rm -f $(OBJS)181
@rm -f ../bin/$(TARGET)182
@rm -f $(HOME)/bin/$(TARGET)183
@rm -f $(HOME)/bin/$(LINK)184
@rm -f ./*.o185
distclean:186
@rm -f ./bin/$(TARGET)187
# ==========================================188

189

190
191

posted on 2015-12-31 20:11 Benjamin 閱讀(3488) 評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi): linux
SOURCES

