Makefile 3、My gcc/g++ Makefile 模板

GCC常用参数

gcc常用参数
 -g         # 生成调试信息
 -w         # 不成成警告信息
 -I         # 指定头文件的搜索路径
 -l         # 指定库
 -L         # 指定库的搜索路径
 -fPIC      # 生成与位置无关的代码
 -shared    # 生成动态库目标文件
 -std=c11   # 指定GNU c的版本
 -std=c99   # 指定GNU c的版本
  -D        # 调试时,指定宏

1、C的Makefile

CC=gcc
CFlagesDebug=-g -w -ggdb -std=c11 -c

#src=fig1.8_P14IntCell.c
#src+=fig1.11_P18.c

#srcPath=./Chapter01
#src=$(srcPath)/fig1.8_P14IntCell.c
#src+=$(srcPath)/fig1.11_P18.c

Project=execute
src=$(wildcard *.c)
obj=$(src:.c=.o)
$(Project):$(obj)
	$(CC) -o $(Project) $(obj)

%.o:%.c
	$(CC) -MM $^ 
	$(CC) $(CFlagesDebug) $^ -o $@

.PHONY:cleanDotObjs
cleanDotObjs:
	-rm -f $(obj) 

.PHONY:cleanDotExecute
cleanDotExecute:
	-rm -f $(Project) 
.PHONY:clean
clean:cleanDotObjs cleanDotExecute

2、C++的Makefile

模板1

#---------------------------------------------------------
# 生成可执行文件 execute
PROJECT     = execute
#---------------------------------------------------------
# .o文件
SrcSuf      = c
SrcSuf2     = cpp
SrcSuf3     = cc
ObjSuf      = o
LibSuf      = so
LibSuf2     = a
#---------------------------------------------------------
#src=fig1.8_P14IntCell.cpp
#src+=fig1.11_P18.cpp
#OBJFILES=$(src:.cpp=.o)

OBJFILES    =  ./TcpDataChannel.$(ObjSuf)
OBJFILES    += ./main.$(ObjSuf) 
OBJFILES    += ./utils.$(ObjSuf) 
OBJFILES    += ./zinx.$(ObjSuf) 
#---------------------------------------------------------
# 头文件目录
INCLUDEPATH =  -I /usr/include/
INCLUDEPATH += -I /usr/local/include 
#INCLUDEPATH += -I /usr/include/c++/4.8.2/
#INCLUDEPATH += -I /usr/local/include/hiredis/
# /usr/include/zinx.h 
# /usr/include/ZinxTCP.h
# /usr/local/include/google/protobuf
# /usr/include/c++/4.8.2/random
# /usr/local/include/hiredis/hiredis.h


# 库目录
LIBPATH     =  -L /usr/local/lib/
LIBPATH     += -L /usr/lib/ 
# /usr/lib/libzinx.so
# /usr/local/lib/libprotobuf.so
# /usr/local/lib/libhiredis.so
#---------------------------------------------------------
CC          =   g++

# 编译选项
CFlag       =   $(INCLUDEPATH) -w -g -ggdb -fshort-wchar -std=c++11 -pthread
#CFlag       =   $(INCLUDEPATH) -Wall -g -ggdb -fshort-wchar -std=c++11 -pthread


# 链接选项
LDFLAGS     +=  $(LIBPATH) 
LDFLAGS     +=  -l pthread         
#LDFLAGS     +=  -l zinx 
#LDFLAGS     +=  -l protobuf
#LDFLAGS     +=  -l hiredis    
#---------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf) .$(SrcSuf2) .$(LibSuf2) .$(SrcSuf3)

all:  $(PROJECT) clean
# 生成可执行文件
$(PROJECT):$(OBJFILES)
	@echo "creating $(PROJECT) start..."
	$(CC) $(LDFLAGS) $(OBJFILES) -o $(PROJECT) 
	@echo "creating $(PROJECT) end"
#---------------------------------------------------------
# .c 生成 .o 文件
.$(SrcSuf).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CC) $(CFlag) -c $< -o $@ 
#---------------------------------------------------------
# .cpp 生成 .o 文件
.$(SrcSuf2).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CXX) $(CFlag) -c $< -o $@
#---------------------------------------------------------
# .cc 生成 .o 文件
.$(SrcSuf3).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CXX) $(CFlag) -c $< -o $@
#---------------------------------------------------------
# 删除 .o 文件
clean:
	@echo "Cleaning $(PROJECT) project files"
	@rm -f $(OBJFILES) core

#---------------------------------------------------------
# make cleanall 删除 .o 文件 execute文件
.PHONY:cleanobj
cleanobj:
	-rm -f $(OBJFILES) 
.PHONY:cleanexe
cleanexe:
	-rm -f $(PROJECT) 
.PHONY:cleanall
cleanall:cleanobj cleanexe

模板2

CXX=g++
CxxFlagesDebug=-g -w -ggdb -std=c++11 -fshort-wchar -c

#src=fig1.8_P14IntCell.cpp
#src+=fig1.11_P18.cpp

#srcPath=./Chapter01
#src=$(srcPath)/fig1.8_P14IntCell.cpp
#src+=$(srcPath)/fig1.11_P18.cpp

Project=execute
src=$(wildcard *.cpp)
obj=$(src:.cpp=.o)
$(Project):$(obj)
	$(CXX) -o $(Project) $(obj)

%.o:%.cpp
	$(CXX) -MM $^ 
	$(CXX) $(CxxFlagesDebug) $^ -o $@


.PHONY:cleanDotObjs
cleanDotObjs:
	-rm -f $(obj) 

.PHONY:cleanDotExecute
cleanDotExecute:
	-rm -f $(Project) 
.PHONY:clean
clean:cleanDotObjs cleanDotExecute

3、C libxxx.a 的Makefile

# 根据 *.c 和 .h
# 生成静态库 calc.a

#---------------------------------------------------------
# 工程名 / 库名 # 生成静态库 libcalc.a  计算简单的加减乘除
PROJECT     = libcalc
OUTNAME     = $(PROJECT).a
#---------------------------------------------------------
# 头文件目录
INCLUDEPATH = -I./include/
#---------------------------------------------------------
# .o文件
SrcSuf      = c
ObjSuf      = o
LibSuf      = so

OBJFILES    = ./add.$(ObjSuf)\
              ./div.$(ObjSuf)\
              ./mult.$(ObjSuf)\
              ./sub.$(ObjSuf)\
#---------------------------------------------------------

CC          = gcc
LD          = ar rcs

# 编译
CFlag       = -w -g -ggdb -fshort-wchar -std=c11 $(INCLUDEPATH)
#---------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)

all:  $(PROJECT) clean

$(PROJECT):$(OBJFILES)
	@echo "Linking $(OUTNAME) start..."
	$(LD) $(OUTNAME) $(OBJFILES)
	@echo "Linking $(OUTNAME) end"

clean:
	@echo "Cleaning $(PROJECT) project files"
	@rm -f $(OBJFILES) core

.$(SrcSuf).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CC) -c $< -o $@ $(CFlag)


# [root@lwh 02staticLib]# make
# Compiling libcalc add.c
# gcc -c add.c -o add.o -w -g -ggdb -fshort-wchar -std=c11 -I./include/
# Compiling libcalc div.c
# gcc -c div.c -o div.o -w -g -ggdb -fshort-wchar -std=c11 -I./include/
# Compiling libcalc mult.c
# gcc -c mult.c -o mult.o -w -g -ggdb -fshort-wchar -std=c11 -I./include/
# Compiling libcalc sub.c
# gcc -c sub.c -o sub.o -w -g -ggdb -fshort-wchar -std=c11 -I./include/
# Linking libcalc.a start...
# ar rcs libcalc.a ./add.o ./div.o ./mult.o ./sub.o 
# Linking libcalc.a end
# Cleaning libcalc project files

# [root@lwh 02staticLib]# ls
# add.c  div.c  include  libcalc.a  main  Makefile  mult.c  sub.c

# [root@lwh 02staticLib]# tree
# .
# ├── add.c
# ├── div.c
# ├── include
# │   └── head.h
# ├── libcalc.a
# ├── main
# │   ├── main.c
# │   └── makefile
# ├── Makefile
# ├── mult.c
# └── sub.c
# 
# 2 directories, 9 files
# [root@lwh 02staticLib]# 
# 根据main.c libcalc.a head.h 
# 生成可执行文件 execute

#---------------------------------------------------------

# 工程名  计算简单的加减乘除
PROJECT     = execute
#---------------------------------------------------------

# .o文件
SrcSuf      = c
ObjSuf      = o
LibSuf      = so

OBJFILES    = ./main.$(ObjSuf)\
#---------------------------------------------------------

# 头文件目录
INCLUDEPATH = -I../include/
#---------------------------------------------------------

#依赖库所在的目录
LIBPATH= -L../
#---------------------------------------------------------

#依赖库的库名
LIBS=../libcalc.a
#---------------------------------------------------------

CC          = gcc
CFlag       = -w -g -ggdb -fshort-wchar -std=c11 $(INCLUDEPATH)
#---------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)

all:  $(PROJECT) clean

$(PROJECT):$(OBJFILES)
	@echo "creating $(PROJECT) start..."
	$(CC) $(OBJFILES) -o $(PROJECT)  $(INCLUDEPATH) $(LIBPATH) $(LIBS) 
	@echo "creating $(PROJECT) end"

#%.o:%.c
#	$(CC) -MM $^
#	$(CC) $(CXXFLAG) -c $^ $(INCLUDEPATH)  -o $@ 

clean:
	@echo "Cleaning $(PROJECT) project files"
	@rm -f $(OBJFILES) core

.$(SrcSuf).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CC) -c $< -o $@ $(CFlag)

4、C libxxx.so 的Makefile

# 根据 *.c 和 .h
# 生成动态库 calc.so

#---------------------------------------------------------
# 工程名 / 库名 # 生成静态库 libcalc.so  计算简单的加减乘除
PROJECT     = libcalc
OUTNAME     = $(PROJECT).so
#---------------------------------------------------------
# 头文件目录
INCLUDEPATH = -I./include/
#---------------------------------------------------------
CC          = gcc
LD          = gcc

LIBEXPORT   = -fvisibility=hidden
.DEFINES    = -DTRACE_LOG
#---------------------------------
# 预处理、编译阶段选项
CFlag       = -w -g -ggdb -fshort-wchar -std=c11 -fPIC $(INCLUDEPATH)
#---------------------------------
#链接选项
CxxFlage    = -shared  $(LIBEXPORT) $(.DEFINES)
#---------------------------------------------------------
# .o文件
SrcSuf      = c
ObjSuf      = o
LibSuf      = so

OBJFILES    = ./add.$(ObjSuf)\
              ./div.$(ObjSuf)\
              ./mult.$(ObjSuf)\
              ./sub.$(ObjSuf)\
#---------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)


all:  $(PROJECT) clean

$(PROJECT):$(OBJFILES)
	@echo "Linking $(OUTNAME) start..."
	$(LD) $(OBJFILES) -o $(OUTNAME) $(CxxFlage) -ldl
	@echo "Linking $(OUTNAME) end"

clean:
	@echo "Cleaning $(PROJECT) project files"
	@rm -f $(OBJFILES) core

.$(SrcSuf).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CC) -c $< -o $@  $(CFlag)


# [root@lwh 03dynamicLib]# make
# Compiling libcalc add.c
# gcc -c add.c -o add.o  -w -g -ggdb -fshort-wchar -std=c11 -fPIC -I./include/
# Compiling libcalc div.c
# gcc -c div.c -o div.o  -w -g -ggdb -fshort-wchar -std=c11 -fPIC -I./include/
# Compiling libcalc mult.c
# gcc -c mult.c -o mult.o  -w -g -ggdb -fshort-wchar -std=c11 -fPIC -I./include/
# Compiling libcalc sub.c
# gcc -c sub.c -o sub.o  -w -g -ggdb -fshort-wchar -std=c11 -fPIC -I./include/
# Linking libcalc.so start...
# gcc ./add.o ./div.o ./mult.o ./sub.o  -o libcalc.so -shared  -fvisibility=hidden -DTRACE_LOG -ldl
# Linking libcalc.so end
# Cleaning libcalc project files

# [root@lwh 03dynamicLib]# ls
# add.c  div.c  include  libcalc.so  main  Makefile  mult.c  sub.c

# [root@lwh 03dynamicLib]# tree
# .
# ├── add.c
# ├── div.c
# ├── include
# │   └── head.h
# ├── libcalc.so
# ├── main
# │   ├── main.c
# │   └── makefile
# ├── Makefile
# ├── mult.c
# └── sub.c
# 
# 2 directories, 9 files
# [root@lwh 03dynamicLib]#
# 根据main.c libcalc.so head.h 
# 生成可执行文件 execute

#---------------------------------------------------------

# 工程名  计算简单的加减乘除
PROJECT     = execute
#---------------------------------------------------------

# .o文件
SrcSuf      = c
ObjSuf      = o
LibSuf      = so

OBJFILES    = ./main.$(ObjSuf)
#---------------------------------------------------------

# 头文件目录
INCLUDEPATH = -I../include/
#---------------------------------------------------------

#依赖库所在的目录
LIBPATH     = -L../
#---------------------------------------------------------

#依赖库的库名
#LIBS        = -l../libcalc.so
LIBS2       = -l calc
#---------------------------------------------------------

CC          = gcc
CFlag       = -w -g -ggdb -fshort-wchar -std=c11  $(INCLUDEPATH)
CxxFlage    = $(INCLUDEPATH) $(LIBPATH)
#---------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf)

all:  $(PROJECT) clean

$(PROJECT):$(OBJFILES)
	@echo "creating $(PROJECT) start..."
	$(CC) $(OBJFILES) -o $(PROJECT) $(CxxFlage) $(LIBS2) 
	@echo "creating $(PROJECT) end"


clean:
	@echo "Cleaning $(PROJECT) project files"
	@rm -f $(OBJFILES) core

.$(SrcSuf).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CC) -c $< -o $@ $(CFlag) 

5、C++ libxxx.so 的Makefile

#---------------------------------------------------------
# 生成可执行文件 libzinx.so
PROJECT     = libzinx
OUTNAME     = $(PROJECT).so
#---------------------------------------------------------
# 文件后缀
SrcSuf      = c
SrcSuf2     = cpp
SrcSuf3     = cc
ObjSuf      = o
LibSuf      = so
LibSuf2     = a
#---------------------------------------------------------
# .o文件
OBJFILES    =  ./TcpDataChannel.$(ObjSuf)
OBJFILES    += ./utils.$(ObjSuf) 
OBJFILES    += ./zinx.$(ObjSuf) 
#---------------------------------------------------------
# 头文件目录
INCLUDEPATH =  -I /usr/include/
INCLUDEPATH += -I /usr/local/include 
# 库目录
LIBPATH     =  -L /usr/local/lib/
LIBPATH     += -L /usr/lib/ 
#---------------------------------------------------------
CC          =   g++
CXX         =   g++
LD          =   g++
# 编译选项
CFlag       =   $(INCLUDEPATH) -w -g -ggdb -fshort-wchar -std=c++11 -fPIC -pthread
#CFlag       =   $(INCLUDEPATH) -Wall -g -ggdb -fshort-wchar -std=c++11 -pthread

# 链接选项
LIBEXPORT   = -fvisibility=hidden
.DEFINES    = -DTRACE_LOG
LDFLAGS     +=  $(LIBPATH) 
LDFLAGS     +=  -l pthread       
LDFLAGS     +=  -shared  $(LIBEXPORT) $(.DEFINES)  
#---------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(LibSuf) .$(SrcSuf2) .$(LibSuf2) .$(SrcSuf3)

all:  $(OUTNAME) clean
# 生成so文件
$(OUTNAME):$(OBJFILES)
	@echo "creating $(OUTNAME) start..."
	$(LD) $(OBJFILES) -o $(OUTNAME) $(LDFLAGS) -ldl
	@echo "creating $(OUTNAME) end"
	strip $(OUTNAME)

# 安装
.PHONY : install
install:$(OUTNAME)
	cp $^  /usr/lib/
	cp *.h /usr/include/
#---------------------------------------------------------
# .c 生成 .o 文件
.$(SrcSuf).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CC) $(CFlag) -c $< -o $@ 
#---------------------------------------------------------
# .cpp 生成 .o 文件
.$(SrcSuf2).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CXX) $(CFlag) -c $< -o $@
#---------------------------------------------------------
# .cc 生成 .o 文件
.$(SrcSuf3).$(ObjSuf):
	@echo "Compiling $(PROJECT) $<"
	$(CXX) $(CFlag) -c $< -o $@
#---------------------------------------------------------
# 删除 .o 文件
clean:
	@echo "Cleaning $(PROJECT) project files"
	@rm -f $(OBJFILES) core

#---------------------------------------------------------
# make cleanall 删除 .o 文件 execute文件
.PHONY:cleanobj
cleanobj:
	-rm -f $(OBJFILES) 
.PHONY:cleanexe
cleanexe:
	-rm -f $(PROJECT) 
.PHONY:cleanall
cleanall:cleanobj cleanexe
[root@lwh CreateZinxTcp]# ll -h libzinx.so 
-rwxr-xr-x. 1 root root 278K Oct 10 00:10 libzinx.so # 278k
[root@lwh CreateZinxTcp]# file libzinx.so 
libzinx.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=cb36f4698281384fe7b3b4782006e6a9a55482d2, not stripped # not stripped表明未压缩
[root@lwh CreateZinxTcp]# strip libzinx.so # 压缩
[root@lwh CreateZinxTcp]# file libzinx.so 
libzinx.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=cb36f4698281384fe7b3b4782006e6a9a55482d2, stripped # stripped表明已经压缩
[root@lwh CreateZinxTcp]# ll -h libzinx.so 
-rwxr-xr-x. 1 root root 76K Oct 10 00:10 libzinx.so # 76k

5. Makefile GCC G++常用选项

CFLAGS

CFLAGS
	-fvisibility=hidden
	-g
	-Wall
	-O
	-O2
-fvisibility=hidden
	在linux下,源文件中的所有函数都有一个默认的visibility属性为public(此时函数对外是可见的)
	
	在编译命令中加入-fvisibility=hidden参数,会将所有默认的public的属性变为hidden;(此时函数对外是不可见的)
	
	此时,如果对函数设置__attribute__ ((visibility(default)))参数,使特定的函数仍然按默认的public属性处理,
	则-fvisibility=hidden参数不会对该函数起作用。(此时函数对外是可见的)

	所以,设置了-fvisibility=hidden参数之后,只有设置了__attribute__ ((visibility(default)))的函数才是对外可见的,如此则效果等同于Visual Studio下的__declspec(dllexport)定义。
-g
	产生GNU-GDB调试所需的符号信息
	对程序源码进行调试,必须加入这个选项
-Wall
	生成所有警告信息
-O
	对程序进行优化编译、链接。
	采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些,而且对执行文件的调试会产生一定的影响,造成一些执行效果与对应源文件代码不一致等一些令人“困惑”的情况。因此,一般在编译生成软件发行版时使用此选项
-O2
	比 -O 更好的优化编译、链接
	当然整个编译链接过程会更慢

LDFLAGS

LDFLAGS
	-lc
	-lm
	-lpthread
	-lz
	-ldl
-lc
	-lc 是link libc.so
	主要包括C标准库函数和系统函数,几乎所有C程序的运行都依赖于libc.so
-lm
	-lm 是link libm
	主要包含数学计算的库
-lpthread
	主要包含线程相关的库
-lz
	-lz 是link libz
	一个免费的、通用的、合法的、不受任何专利限制的无损数据压缩库,可用于几乎任何计算机硬件和操作系统
-ldl
	Linux 系统 如果你的程序中使用dlopen、dlsym、dlclose、dlerror 显示加载动态库,需要设置链接选项

猜你喜欢

转载自blog.csdn.net/liangwenhao1108/article/details/105068399