设为首页 加入收藏

TOP

轻松玩转Makefile | 企业项目级Makefile实例(一)
2023-07-23 13:28:49 】 浏览:55
Tags:松玩转 Makefile 项目级 实例

前言

本文展示了一个比较完整的企业项目级别的Makefile文件,包括了:文件调用,源文件、头文件、库文件指定,软件版本号、宏定义,编译时间,自动目录等内容。

1、目录架构

本文中所采用的目录架构,在企业项目开发中十分常见:源文件都放在src目录中,头文件都放在inc目录中,并且这两个目录都可以有对应的子目录。库文件放在lib目录中,makefile相关文件放在build目录中,编程生成的程序放在自动生成的output目录中。目录结构展示如下:

.
├── build
│   ├── Makefile
│   └── srcpathconfig.mk
├── code
│   ├── inc
│   │   ├── com
│   │   └── func
│   │       └── fun.h
│   └── src
│       ├── com
│       │   └── main.c
│       └── func
│           └── fun.c
└── lib
    ├── inc
    │   └── mylib.h
    └── libs
        └── libmylib.so

2、源文件及Makefile内容

本文所用到的所有文件,也可以直接到我的公众号,后台回复“ mk ”获取。

源文件

/* fun.h */
#ifndef __FUN_H__
#define __FUN_H__

void fun();

#endif


/* fun.c */
#include <stdio.h>

void fun()
{

#ifdef MACRO_DEF
    printf("macro definition enable!\n");
#endif


#ifdef COMPILER_IS_ARM_LINUX_GCC
    printf("The compilation target is arm!\n");
#endif

#ifdef COMPILER_IS_LINUX_GCC
    printf("The compilation target is linux!\n");
#endif

	printf("This is fun()!\n");
}

/* mylib.h */
void mylib();


/* libmylib.so */
// mylib()函数,打印This is mylib()!

/* main.c */
#include "fun.h"
#include "mylib.h"

int main()
{ 
    fun();
	mylib();
    return 0; 
}

srcpathconfig.mk

这个文件的内容,其实也可以放在Makefile中,本案例单独用一个文件来配置路径,是为了后期好管理

#源文件目录
SRCCODEDIRS   :=../code/src/func \
                ../code/src/com \
	

#头文件目录
SRCHEADDIRS   :=../code/inc/func \
				../code/inc/com \

#lib文件目录
LIBFILEDIRS := ../lib/libs

#lib头文件目录
LIBHEADDIRS := ../lib/inc/

#lib文件
LIBFILE := -lmylib

Makefile

#引用其他文件
include srcpathconfig.mk

#时间信息
tmpbuildtm := `date |sed 's/ /_/g'`
TMPBUILDTM = $(tmpbuildtm)

#软件版本
APPVERSION = 1.0.0.0


#不同的目标采用不同的宏定义
ifeq ($(MAKECMDGOALS),arm)
COMPILEMACRO += COMPILER_IS_ARM_LINUX_GCC
else
COMPILEMACRO += COMPILER_IS_LINUX_GCC MACRO_DEF
endif


#循环获取源文件和中间件
SRCFILE := $(foreach d,$(SRCCODEDIRS),$(wildcard $(addprefix $(d)/*,.c)))
OBJFILE := $(patsubst %.c,%.o,$(SRCFILE))

#宏定义,源文件路径,头文件路径
CURCMPLMACRO   := $(addprefix -D ,$(COMPILEMACRO))
CURSRCHEADDIRS := $(addprefix -I ,$(SRCHEADDIRS))
CURLIBHEADDIRS := $(addprefix -I ,$(LIBHEADDIRS))

#程序输出路径
OUTPUTDIR := ../output

#编译器及选项
CC := gcc
CFLAGS := -Wall -c

RM := rm
RMFLAGS := -rf

#目标文件	
TARGETNAME = app

$(TARGETNAME):$(OBJFILE)
	@mkdir -p $(OUTPUTDIR)
	@echo ""
	@echo "all files have been compiled , now begin to link every obj for excutable file"
	@echo ""
	@echo "linking............"
	@echo $(OBJFILE)
	@$(CC)  -o $(OUTPUTDIR)/$(TARGETNAME).$(APPVERSION) $(OBJFILE) -L$(LIBFILEDIRS) $(LIBFILE)
	@echo ""
	@echo "linked ok," $(TARGETNAME) "has been created"
	@echo ""
	@echo $(TMPBUILDTM)
	
%.o: %.c
	@echo ""
	@echo "start " $< "......compiling"
	@$(CC) $(CURCMPLMACRO) $(CFLAGS) $(CURSRCHEADDIRS) $(CURLIBHEADDIRS) $< -o $@
	@echo "created " $@
	@echo "end   " $< "......compiled ok"
	@echo ""

.PHONY: arm clean

arm:$(TARGETNAME)

clean:
	@-$(RM) $(RMFLAGS) $(TARGETNAME) $(OBJFILE) $(OUTPUTDIR)

3、效果演示

输入make 或者 make arm ,打

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇LWIP学习记录------ARP协议(1).. 下一篇轻松玩转Makefile | 基础用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目