Makefile之学习总结(2)--- Makefile (v1.0)

此文章中的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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值