makefile编写---.c .cpp 混合编译makefile 模板

# c.cpp混合编译的makefile模板
#
#

BIN = client_system

BASE_INSTALL_DIR := /opt/arm-2009q1

BUILD_TOOL_DIR := $(BASE_INSTALL_DIR)

BUILD_TOOL_PREFIX := $(BUILD_TOOL_DIR)/bin/arm-none-linux-gnueabi-

CC = $(BUILD_TOOL_PREFIX)gcc
CPP = $(BUILD_TOOL_PREFIX)g++

INCS =
LIBS =
SUBDIRS =
#生成依赖信息时的搜索目录,比如到下列目录中搜索一个依赖文件(比如.h文件)
#DEFINC = -I"./../../base/" -I"./../common" -I"./../../lib/lxnet/" -I"./../../lib/tinyxml/src/"
DEFINC = -I"./BasicUsageEnvironment/include" -I"./groupsock/include" -I"./liveMedia/include" \
-I"./UsageEnvironment/include" -I"./myclient"
#给INCS加上依赖搜索路径,分开写可能会产生不一致情况,而且繁琐
#//254434326

#maintest.c tree/rbtree.c 多了子目录,那就直接添加 目录/*.c即可 所有的源文件-- .c文件列表
#CSRCS = $(wildcard ./*.c ./../../base/log.c ./../../base/corsslib.c ./../../base/idmgr.c ./../../base/pool.c)
#CPPSRCS = $(wildcard ./*.cpp ./../common/backcommand.cpp ./../common/connector.cpp)
CSRCS = $(wildcard ./*.c ./BasicUsageEnvironment/*.c ./groupsock/*.c ./liveMedia/*.c \
./UsageEnvironment/*.c ./myclient/*.c)
CPPSRCS = $(wildcard ./*.cpp ./BasicUsageEnvironment/*.cpp ./groupsock/*.cpp ./liveMedia/*.cpp \
./UsageEnvironment/*.cpp ./myclient/*.cpp)

#所有的.o文件列表
COBJS := $(CSRCS:.c=.o)
CPPOBJS := $(CPPSRCS:.cpp=.o)

#生成依赖信息 -MM是只生成自己的头文件信息,-M 包含了标准库头文件信息。
#-MT 或 -MQ都可以改变生成的依赖 xxx.o:src/xxx.h 为 src/xxx.o:src/xxx.h 当然。前面的 src/xxx.o需自己指定
#格式为 -MM 输入.c或.cpp 查找依赖路径 -MT或-MQ 生成规则,比如src/xxx.o
MAKEDEPEND = gcc -MM -MT
CFLAGS = -g3 -O0 -Wall -DBSD=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
#CFLAGS += -Wall -ansi -DWIN32 -DNDEBUG -O2
CPPFLAGS = -g3 -O0 -Wall -DBSD=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
#CPPFLAGS += -Wall -DWIN32 -DNDEBUG -O2
#-g 生成调试信息
#-pedantic参数与-ansi一起使用 会自动拒绝编译非ANSI程序
#-fomit-frame-pointer 去除函数框架
#-Wmissing-prototypes -Wstrict-prototypes 检查函数原型
#针对每个.c文件的.d依赖文件列表
CDEF = $(CSRCS:.c=.d)
CPPDEF = $(CPPSRCS:.cpp=.d)
PLATS = win32-debug win32-release linux-debug linux-release
none:
@echo "Please choose a platform"
@echo $(PLATS)
win32-debug:
$(MAKE) all INCS=-I"c:/mingw/include" LIBS="-L"c:/mingw/lib" -L"./../../lib/lxnet" -llxnet -lws2_32 -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DWIN32 -DDEBUG -g" CPPFLAGS="-Wall -DWIN32 -DDEBUG -g"
win32-release:
$(MAKE) all INCS=-I"c:/mingw/include" LIBS="-L"c:/mingw/lib" -L"./../../lib/lxnet" -llxnet -lws2_32 -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DWIN32 -DNDEBUG -O2" CPPFLAGS="-Wall -DWIN32 -DNDEBUG -O2"
linux-debug:
$(MAKE) all INCS=-I"/usr/include" LIBS="-L"/usr/lib" -L"./../../lib/lxnet" -llxnet -lpthread -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DDEBUG -g" CPPFLAGS="-Wall -DDEBUG -g"
linux-release:
$(MAKE) all INCS=-I"/usr/include" LIBS="-L"/usr/lib" -L"./../../lib/lxnet" -llxnet -lpthread -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DNDEBUG -O2" CPPFLAGS="-Wall -DNDEBUG -O2"
all:$(BIN)
#生成.o的对自己目录中.h .c的依赖信息.d文件到.c所在的路径中
#$(DEF)文件是.d文件名列表(含目录),比如tree.d 匹配成功那么%就是tree,然后在尝试%.c,如果成功。则执行规则
# $(<:.c=.o)是获取此.c文件的名字(含路径),然后变为.o比如 src/xxx.o。 以形成如下
# src/xxx.o : src/xxx.c ***.h ***.h 最前面!!注意。
# 此做法是每个.d都和生成他的.c在一个目录里,所以需要这样做。
# $(<:.c=.o)之类的 。此时的<相当于变量$< 。切记
# : : : 含义同下
$(CDEF) : %.d : %.c
$(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > [email protected]
$(CPPDEF) : %.d : %.cpp
$(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > [email protected]
#先删除依赖信息
#重新生成依赖信息
#这里出现了一个 $(MAKE) 没有定义的变量。这个变量是由 Make 自己定义的,它的值即为自己的位置,方便 Make 递归调用自己。
depend:
-rm $(CDEF)
-rm $(CPPDEF)
$(MAKE) $(CDEF)
$(MAKE) $(CPPDEF)
#$(OBJS):%.o :%.c 先用$(OBJS)中的一项,比如foo.o: %.o : %.c 含义为:试着用%.o匹配foo.o。如果成功%就等于foo。如果不成功,
# Make就会警告,然后。给foo.o添加依赖文件foo.c(用foo替换了%.c里的%)
# 也可以不要下面的这个生成规则,因为下面的 include $(DEF) 就隐含了。此处为了明了,易懂。故留着
$(COBJS) : %.o: %.c
$(CC) -c $< -o [email protected] $(INCS) $(DEFINC) $(CFLAGS)
$(CPPOBJS) : %.o: %.cpp
$(CPP) -c $< -o [email protected] $(INCS) $(DEFINC) $(CPPFLAGS)
# [email protected]目标文件,$^--所有的依赖文件,$<--第一个依赖文件。每次$< [email protected] 代表的值就是列表中的
#
$(BIN) : $(COBJS) $(CPPOBJS)
$(CPP) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)
-rm $(COBJS) $(CPPOBJS)
# 链接为最终目标

#引入了.o文件对.c和.h的依赖情况。以后.h被修改也会重新生成,可看看.d文件内容即知道为何
#引入了依赖就相当于引入了一系列的规则,因为依赖内容例如: 目录/xxx.o:目录/xxx.c 目录/xxx.h 也相当于隐含的引入了生成规则
#故上面不能在出现如: $(OBJS) : $(DEF)之类。切记
#include $(CDEF) $(CPPDEF)
.PHONY:clean cleanall
#清除所有目标文件以及生成的最终目标文件
clean:
-rm $(BIN) $(COBJS) $(CPPOBJS)
#rm *.d
cleanall:
-rm $(BIN) $(COBJS) $(CPPOBJS)

http://blog.csdn.net/linking530/article/details/6315172

时间: 2024-10-10 05:48:47

makefile编写---.c .cpp 混合编译makefile 模板的相关文章

makefile编写---单个子目录编译模板

经过这次地库项目之后,虽然时间不久,跟团队在一起,虽然队员不一定在技术上有过人之处,但是来自大公司的员工,在工具使用和代码规范方面还是有点可鉴之处,在搭建主控模块是,就得面临makefile编写,因为所有的功能模块都得自己实现,所以使得我不得不熟练下makefile,至少在以后的项目中,能用上自己写的模板! 在默认的方式下,也就是我们只输入make命令.那么, 1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件.    2.如果找到,它会找文件中的第一个目标文件(

3.android下Makefile编写规范

随着移动互联网的发展,移动开发也越来越吃香了,目前最火的莫过于android,android是什么就不用说了,android自从开源以来,就受到很多人的追捧.当然,一部人追捧它是因为它是Google开发的.对一个程序员来说,一个系统值不值得追捧得要拿代码来说话.我这里并不打算分析android的代码,而是android的makefile,也许大家已经知道了在android源码里,我们可以看见很多makefile文件,起初我也不明白,经过一段时间的研究,后来慢慢明白了,我想通过分析andorid的

单目录下多文件 makefile编写

makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东西,记录下来,以便后面查阅: 这篇blog要分享的是在单目录下多文件的makefile编写,首先说明当前目录下有多少文件:fun.h   fun.c  main.c  makefile:其中*.c 文件都要依赖 *.h文件: 首先常规编译: 预处理期:gcc  -E  -o fun.i  fun.c

小型C/C++项目的makefile编写

[前言]在我所接触到的Linux嵌入式开发中,大多使用的是C语言,采用makefile文件对源文件进行编译后生成可执行文件.本文即从个人经历上介绍小型的C项目如何编写makefile文档. 一.gcc命令 从目的上看,gcc命令和makefile的功能是一样,即是把源文件编译后生成可执行文件或.o二进制文件.gcc命令中有许多的额外的参数,本文仅介绍以下几种最简单和常用的方法: 有helloworld.c文件如下: #include <stdio.h> int main() { printf(

linux下makefile编写及automake整理

makefile编写规则 在一个makefile中通常包含如下内容: 1 需要由make工具创建的目标体(target),通常是目标文件或可执行文件 2 要创建的目标体所依赖的文件(dependency_file) 3 创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头 格式: target: dependency_files command /* 该行必须以tab键开头*/ 例如,有两个文件分别为hello.c和hello.h,创建的目标体为hello.o,执

Makefile编写

对于多个.c文件来说编译比较麻烦,在这里我就给大家介绍一下makefile的编写. Makefile 有三个非常有用的变量:[email protected],$^,$<.其意义为: [email protected]:目标文件 $^:所有的依赖文件 $<:第一个依赖文件 .c.o:表示所有的.o文件都依赖.c文件 这样Makefile就可以简化成如下: ################################################## # Makefile  example

linux 下C语言编程库文件处理与Makefile编写

做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目.今天学了2点,一个是库文件处理,另一个是makefile编写. 学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西. gcc的编译过程 首先需要清楚gcc编译做了些什么 源文件

GNU Makefile编写

[Introduction] make 是程序员很好用的工具,如果存在makefile存在,每次更新代码,执行shell命令 shell 就可以执行所有需要编译的文件,make是根据你编写的Makefile文件和源程序的最后的修改时间来决定哪些文件需要更新重编的. [Introduction to Makefiles] 问题的关键是如何编写一个Makefile文件,我们都是通过Makefile 来告诉make工具怎么去做.一个简单的makefile的规则如下: target ... : prer

内核Makefile编写

对于大部分内核模块或设备驱动的开发者和使用者来说,最常接触到的就是各层目录下基于kbuild架构的kbuild Makefile文件.主要部分有:1.目标定义,目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核. 最简单的只有一行,如obj-y += foo.o表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,而obj-m则表示该文件要作为模块编译.除了y,m以外的obj-x形式的目标都不会被编译. 由于既可以编译成模块,也可以编译进内核,更常见的做法是根据.co