文档章节

我的makefile

JenkinZhou
 JenkinZhou
发布于 2017/05/08 16:38
字数 643
阅读 40
收藏 0

可编译 可执行文件、动态库、静态库,修改头文件能够重新编译相关的源文件。

加入了头文件修改重新编译的功能后,.d和.o的目录便不能修改,一旦修改,要么重新编译整个工程,要么无法实现此功能。

#------------------------------------------------------------------------------
## 构建目标(可执行程序、动态库、静态库)
EXETARGET  = main
DLL_LIB    =
STATIC_LIB =
## 源码列表()
SRC_C      =
SRC_CC     = main.cc
SRC_CPP    =
#==============================================================================

#------------------------------------------------------------------------------
## 自定义头文件路径
C_INCPATH   =
CXX_INCPATH =$(C_INCPATH)
## 依赖库文件路径
C_LIBPATH   =
CXX_LIBPATH =
## 依赖库
C_LIB       =
CXX_LIB     =
## compile flags
C_FLAGS     =
CXX_FLAGS   =
#==============================================================================

#------------------------------------------------------------------------------
#### 系统文件头路径
C_DEFAULT_INCPATH = -I./
#    -I/usr/lib/gcc/x86_64-linux-gnu/5/include
#    -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
#    -I/usr/include/x86_64-linux-gnu
#    -I/usr/local/include
#    -I/usr/include
CXX_DEFAULT_INCPATH = $(C_DEFAULT_INCPATH)
#    -I/usr/include/x86_64-linux-gnu/c++/5
#    -I/usr/include/c++/5/backward
#    -I/usr/include/c++/5
## 系统库路径
C_DEFAULT_LIBPATH   =
CXX_DEFAULT_LIBPATH =
## 默认的一些FLAG
C_DEFAULT_FLAGS     = -g -O2 -Wall -std=gnu11
CXX_DEFAULT_FLAGS   = -g -O2 -Wall -std=gnu++11
#==============================================================================

#------------------------------------------------------------------------------
## 编译器及一些工具(可以提供交叉编译)
CROSS_COMPILE_HEADER =
CC     = $(CROSS_COMPILE_HEADER)gcc
CXX    = $(CROSS_COMPILE_HEADER)g++
AR     = $(CROSS_COMPILE_HEADER)ar
AS     = $(CROSS_COMPILE_HEADER)as
LD     = $(CROSS_COMPILE_HEADER)ld
RANLIB = $(CROSS_COMPILE_HEADER)ranlib
STRIP  = $(CROSS_COMPILE_HEADER)strip
GCOV   = $(CROSS_COMPILE_HEADER)gcov
NM     = $(CROSS_COMPILE_HEADER)nm
RM     = rm
ECHO   = echo
MKDIR  = mkdir -p
## 是否打印编译过程,如果不需要打印,则设置为@
PHEAD  = @
#==============================================================================

#------------------------------------------------------------------------------
#### 对以上的参数进行汇总,以便生成最后的编译命令
## FLAG
FLAGS_C     = $(C_DEFAULT_FLAGS) $(C_FLAGS)
FLAGS_CXX   = $(CXX_DEFAULT_FLAGS) $(CXX_FLAGS)
## 头文件
INCPATH_C   = $(C_INCPATH) $(C_DEFAULT_INCPATH)
INCPATH_CXX = $(CXX_INCPATH) $(CXX_DEFAULT_INCPATH)
## 库路径
LIBPATH_C   = $(C_LIBPATH) $(C_DEFAULT_LIBPATH)
LIBPATH_CXX = $(CXX_LIBPATH) $(CXX_DEFAULT_LIBPATH)
## 依赖库
LIB_C       = $(C_LIB)
LIB_CXX     = $(CXX_LIB)
## 编译的.o文件存放路径
OBJS_DIR    = objs/
## 库的路径
TARGET_DIR  = 
## C/CXX分别对应的目标
OBJS_C     := $(patsubst %.c, %.o, $(SRC_C))
OBJS_CC     =$(patsubst %.cc, %.o, $(SRC_CC))
OBJS_CPP    =$(patsubst %.cpp, %.o, $(SRC_CPP))
OBJS_CXX    = $(OBJS_CC) $(OBJS_CPP)
OBJS        = $(OBJS_C) $(OBJS_CXX)
#NEWOBJS     = $(patsubst %.o, $(OBJS_DIR)%.o, $(OBJS))
NEWOBJS     = $(OBJS)
## 构建依赖的.d文件
DEPENDSFILE = $(patsubst %.o, %.d, $(OBJS))
#==============================================================================

#------------------------------------------------------------------------------
## compiler
COMPILER_C      = $(CC) $(FLAGS_C) $(INCPATH_C)
COMPILER_CXX    = $(CXX) $(FLAGS_CXX) $(INCPATH_CXX)
## linker
LINKER          = $(CC)
ifneq ($(OBJS_CXX),)
	LINKER      = $(CXX)
endif
#==============================================================================

#------------------------------------------------------------------------------
## target
.PHONY: all
all: prebuild $(EXETARGET) $(DLL_LIB) $(STATIC_LIB) postbuild

prebuild:
#	@test -d $(OBJS_DIR) || mkdir -p $(OBJS_DIR)
#	@test -d $(TARGET_DIR) || mkdir -p $(TARGET_DIR)
	@$(ECHO) "--Compile start......"

postbuild:
	@$(ECHO) "--Compile completely......"

#sinclude $(DEPENDSFILE)
#### dependence files
%.d: %.c
#	@$(ECHO) "  generate\t $@"
#	@test -d $(OBJS_DIR) || mkdir -p $(OBJS_DIR)
	$(PHEAD)$(CC) -MM $< > $@
#sinclude $(SRC_C:.c=.d)
%.d: %.cc
#	@$(ECHO) "  generate\t $@"
#	@test -d $(OBJS_DIR) || mkdir -p $(OBJS_DIR)
	$(PHEAD)$(CXX) -MM $< > $@
sinclude $(SRC_CC:.cc=.d)
%.d: %.cpp
#	@$(ECHO) "  generate\t $@"
#	@test -d $(OBJS_DIR) || mkdir -p $(OBJS_DIR)
	$(PHEAD)$(CXX) -MM $< > $@
#sinclude $(SRC_CPP:.cpp=.d)

#### object files
%.o: %.c
	@$(ECHO) "  compile\t $<"
	$(PHEAD)$(COMPILER_C) -c $(CFLAGS) $< -o $@
%.o: %.cc
	@$(ECHO) "  compile\t $<"
	$(PHEAD)$(COMPILER_CXX) -c $< -o $@
%.o: %.cpp
	@$(ECHO) "  compile\t $<"
	$(PHEAD)$(COMPILER_CXX) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c $< -o $@

#### 可执行文件
$(EXETARGET): $(NEWOBJS)
ifneq ($(EXETARGET),)
	@$(ECHO) "  LINK  \t $(EXETARGET) [$(NEWOBJS)]"
	$(PHEAD)$(LINKER) $(LIBPATH_C) -o $(TARGET_DIR)$(EXETARGET) $(NEWOBJS) $(LIB_C)
endif
#### 动态库
$(DLL_LIB): $(NEWOBJS)
ifneq ($(DLL_LIB),)
	@$(ECHO) "  LINK  \t $(DLL_LIB) [$(NEWOBJS)]"
	$(PHEAD)$(CXX) -shared $(LIBPATH_C) -o $(TARGET_DIR)$(DLL_LIB) $(NEWOBJS) $(LIB_C)
endif
#### 静态库
$(STATIC_LIB): $(NEWOBJS)
ifneq ($(STATIC_LIB),)
	@$(ECHO) "  AR  \t $(STATIC_LIB) [$(NEWOBJS)]"
	$(PHEAD)$(AR) -r $(TARGET_DIR)$(STATIC_LIB) $(NEWOBJS)
endif

#### clean files
.PHONY: clean
clean:
	@$(ECHO) "--make clean......"
	$(PHEAD)$(RM) -f $(EXETARGET) $(DLL_LIB) $(STATIC_LIB) *.o *.d
#	$(PHEAD)$(RM) -f $(OBJS_DIR)/*
#==============================================================================

 

© 著作权归作者所有

JenkinZhou
粉丝 1
博文 21
码字总数 8038
作品 0
渝北
程序员
私信 提问
读书之--跟我一起写Makefile

前言 以前在Windows下学习的时候,我一直使用Eclipse写C语言程序,比较标准C,GTK+.后来忽有一天学习Linux的时候,看到软件安装那里说了make这个工具,一时之间大是喜欢.因为我本人特别喜欢命令行...

小代码2016
2014/11/10
0
0
用Makefile和gccgo来构建mips32下的Go项目报错,求助

由于我的是mips32,go不支持mips32,只能用gccgo来编译够程序,而且我的project组织结构比较复杂,分了许多目录和库呀等等,必须自己写Makefile来构建我的go项目 假设我有源文件/my/path/a....

TymonHuang
2016/10/25
349
0
makefile 之阶段总结--1--写一个简单的makefile

一. 没有makefile&&make的时候 在没有make&&makefile的时候,我是在IDE中编译程序的.最开始使用命令行编译程序,是在写OJ题目的时候,毕竟OJ题目只需要一个文件,在命令行中编译运行...

小代码2016
2014/11/14
0
0
Eclipse中使用自己的makefile管理工程

我用的环境: (1)系统: Ubuntu 11.04 (2)Eclipse + CDT 1. 在建立工程的时候选择makefile工程。 2.将makefile文件和你写好的工程文件(源文件和头文件)导入到刚刚创建的工程中。 3. 如...

苗永超
2014/11/25
0
0
读书之--GNU make 项目管理

在看过一点<跟我一起makefile>之后,我买了一本<GNU make 项目管理> 写下今天的成果: 我之前的Makefile: # 程序的名字PROGRAM=test 程序源代码集 C_SOURCES=test.c sum.c .o文件 ${...

小代码2016
2014/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySql双主架构原理

在企业中,一般系统架构的瓶颈会出现在数据库这一部分,mysql主从架构在很大程度上解决了这部分瓶颈,但是在mysql主从同步的架构也存在很多问题;比如:1.关于数据写入部分(也就是主库)往往很难做...

xiaomin0322
23分钟前
0
0
分布式系统中一致性哈希

问题场景 近年来B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来。分布式系统相对于单系统,解决了流量大、系统高可用和高容错等问题。功能强大也意味着实现起来需要更多...

Java领航员
25分钟前
0
0
接口限流算法:漏桶算法和令牌桶算法

漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定...

铁骨铮铮
32分钟前
4
0
Android 生成二维码工具类

/** * 生成条形码和二维码的工具 */public class ZXingUtils { /** * 生成二维码 要转换的地址或字符串,可以是中文 * * @param url * @param width ...

lanyu96
37分钟前
1
0
谈谈lucene的DocValues特性之SortedNumericDocValuesField

前面已经介绍过NumericDocValuesField,这里想强调一下SortedNumericDocValuesField是针对同一篇文档中一键多值的情况进行排序的,换句话说不同文档的同一字段值可以乱序。核心的写入流程与谈...

FAT_mt
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部