此文章中的Makefile特点:
1)支持指定平台的make命令,如:make platform=m64x86
2)需要手动添加源码目录
3)自动添加Include目录,但只支持L2级目录,仅形如后面两种:./Include和./Include/gtest
4)所有.o目标文件都编译生成到指定一个目录下./objs
5)不支持生成本工程的.a库(暂时不打算支持)
其中2)和3)是本版Makefile的局限性,下一版本会优化此局限性。
本工程涉及到了:依赖库、Include、Src、main.cpp等使用到的makefile知识,后续会继续丰富工程结构,和更新对应的Makefile文件。转载请注明来源:http://blog.csdn.net/u012421852/article/details/52124724。
工程中的源代码文件内容如下所示:
//main.cpp
#include "Hello.h"
#include "Utile.h"
int main(int args, char **argv)
{
BlueSky::CHello dog;
dog.hello();
BlueSky::CUtile cat;
cat.hello();
}
//Utile.h
#ifndef UTILE_H_
#define UTILE_H_
namespace BlueSky{
class CUtile {
public:
CUtile();
~CUtile();
void hello();
};
}
#endif
//Utile.cpp
#include "Utile.h"
#include <stdio.h>
namespace BlueSky{
CUtile::CUtile()
{}
CUtile::~CUtile()
{}
void CUtile::hello()
{
printf("hello CUtile class!\n");
}
}
//Hello.h
#ifndef HELLO_H_
#define HELLO_H_
namespace BlueSky{
class CHello {
public:
CHello();
~CHello();
void hello();
};
}
#endif
//Hello.cpp
#include "Hello.h"
#include <stdio.h>
namespace BlueSky{
CHello::CHello()
{}
CHello::~CHello()
{}
void CHello::hello()
{
printf("hello CHello class!\n");
}
}
下面为整个工程的Makefile文件内容:
#Makefile
####设置target
.PHONY:all platforms srcDirPaths srcNames includeDirPaths objNames cflags objFilePaths objs a.out
all: platforms srcDirPaths srcNames includeDirPaths objNames objFilePaths objs a.out
###set complier
CC=gcc
CPP=g++
RM=rm
###set platform
ifneq ($(PLATFORM), )
platform=$(PLATFORM)
else
platform=m64x86
endif
####current path
PWD=$(shell pwd)
SRCDIR=$(PWD)/Src
INCLUDEDIR=$(PWD)/Include
###添加源代码路径
src_dirpaths += $(PWD)
src_dirpaths += $(SRCDIR)
src_dirpaths += $(SRCDIR)/Common
vpath %.cpp $(src_dirpaths)
###添加Include以及子目录路径
include_dirpaths += $(PWD)/Include
include_dirpaths += $(foreach dir, $(shell ls $(INCLUDEDIR)), $(INCLUDEDIR)/$(dir))
include_dirpaths += $(src_dirpaths)
###添加.cpp源文件集合
src_names=$(foreach dir, $(src_dirpaths), $(filter %.cpp, $(shell ls $(dir))))
###添加.cpp对应的.o目标文件名称集合
obj_names=$(patsubst %.cpp, %.o, $(src_names))
###添加.cpp对应的.o目标文件路径集合
obj_dirpath = $(PWD)/objs
$(shell mkdir -p $(obj_dirpath))
obj_filepaths = $(foreach objname, $(obj_names), $(obj_dirpath)/$(objname))
####设置CXXFLAGS
CXXFLAGS += -lstdc++ -Wall -g -lpthread
CXXFLAGS += $(foreach dir, $(include_dirpaths), -I$(dir))
####设置LDFLAGS
LDFLAGS += -L$(PWD)/Depend/$(platform)
LDFLAGS += -Igtest.a -lrt -lpthread
###编译生成所有的目标文件
$(obj_dirpath)/%.o:%.cpp
$(CPP) $(CXXFLAGS) -c $< -o $@
###链接生成最终可执行文件
TARGET = a.out
$(TARGET):$(obj_filepaths)
$(CPP) -o $@ $^ $(LDFLAGS)
.PHONY: clean cleanall cleanobj
clean:cleanall cleanobj
@-$(RM) $(TARGET)
cleanall:cleanobj
@-$(RM) $(obj_filepaths)
@-$(RM) $(obj_dirpath) -r
#####debug
platforms:
@echo "=======platform========="
@echo $(platform)
@echo "************************"
srcDirPaths:
@echo "=======src_dirpaths========="
@echo $(src_dirpaths)
@echo "************************"
includeDirPaths:
@echo "=======include_dirpaths========="
@echo $(include_dirpaths)
@echo "************************"
srcNames:
@echo "=======src_names========="
@echo $(src_names)
@echo "************************"
objNames:
@echo "=======obj_names========="
@echo $(obj_names)
@echo "************************"
objFilePaths:
@echo "=======obj_filepaths========="
@echo $(obj_filepaths)
@echo "************************"
cflags:
@echo "=======CFLAGS========="
@echo $(CXXFLAGS)
@echo "************************"
ldflags:
@echo "=======LDFLAGS========="
@echo $(LDFLAGS)
@echo "************************"
objs:
@echo "=======objs========="
@echo $(shell ls $(obj_dirpath))
@echo "************************"
在工程PWD进行make可以成功,且生成a.out可执行文件,如下所示:
运行可执行文件得到,如下结果:
可以得知,以上makefile是正确可用的。
(END)