通用的简单Makefile之单文件单程序

本文介绍了一种用于Ubuntu系统的简易Makefile模板,它能够自动编译当前目录下的所有C源文件,生成可执行程序。该Makefile支持指定目标程序和对象文件的保存路径,并通过伪目标实现了单独编译特定模块的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    因为自己记性太差,很多东西隔段时间就会忘记,就经常会写点小程序做个测试,这些程序非常小,基本都会将代码放在一个代码文件中。虽然编译它们也就是一条语句,但是有时候会差点头文件、或者敲错字符啥的,每次都要在终端下敲编译命令也挺烦的,索性就写了这个Makefile文件,在ubuntu下当作模板,下次即使不小心把测试代码都删了也还能拿来就用。

    该Makefile主要是把当前目录下的所有“.c”文件都分别编译为一个小程序。

    例如我的文件目录如下:

    

   Makefile文件

CC=$(shell which gcc)
CXX=$(shell which g++)

# 设定目标程序和obj文件的保存路径,可以设置为空,即保存在当前目录下
OBJDIR=obj/
BINDIR=bin/

# source files:目前只扫描.c文件
SRC=$(wildcard *.c)
OBJS=$(patsubst %.c,%.o,$(SRC))
PROGRAMS=$(patsubst %.c,%,$(SRC))

# 拼接obj和目标路径
FULLOBJS=$(addprefix ${OBJDIR},${OBJS})
TARGETS=$(addprefix ${BINDIR},${PROGRAMS})

# whether has something to do
ifeq (,${TARGETS})
	$(error No ".c" file found!)
endif

#### $(call rmdir-quiet,<directory>)
## If the directory is not empty, it will failure.
define rmdir-quiet
	if [ -d $1 ]; then rmdir $1; fi
endef

# 将每个文件名作为目标,并全部定义为伪目标,方便单独编译某个模块
.PHONY : ${PROGRAMS}

# default to produce all targets
all: ${TARGETS}

${PROGRAMS}:%:${BINDIR}%

${TARGETS}: ${BINDIR}%:${OBJDIR}%.o
	$(if ${BINDIR},$(shell mkdir -p ${BINDIR}))
	$(CC) $< -o $@

${OBJDIR}%.o : %.c
	$(if $(OBJDIR),$(shell mkdir -p $(OBJDIR)))
	$(CC) -c $< -o $@

clean:
	$(foreach tag, ${TARGETS}, rm -f ${tag})
	$(foreach tag, ${FULLOBJS}, rm -f ${tag})
	$(if ${OBJDIR}, $(call rmdir-quiet,$(OBJDIR)))
	$(if ${BINDIR}, $(call rmdir-quiet,$(BINDIR)))

test_make.c文件

#include <stdio.h>

int main(int argc, char** argv)
{
		printf("Hello world!\n");
		return 0;
}
timer.c文件

#include <sys/time.h>
#include <signal.h>

#include <stdio.h>
#include <assert.h>

static long count = 0;

void setTimeVal(struct timeval* time, long sec, long usec)
{
		assert(time);

		time->tv_sec = sec;
		time->tv_usec = usec;
}

void handleProf(int sig)
{
		printf("sig[%d]--timer count--%ld\n", sig, count++);
}

int main(int argc, char** argv)
{
		struct itimerval itimer;

		setTimeVal(&itimer.it_value, 1, 0);
		setTimeVal(&itimer.it_interval, 1, 0);// 设置循环使用定时器
		//setTimeVal(&itimer.it_interval, 0, 0);// 设置单次定时器

		signal(SIGPROF, handleProf);

		setitimer(ITIMER_PROF, &itimer, NULL);

		while (1);

		return 0;
}


然后在终端输入

$make <两次TAB>


$make timer

即可生成一个名为timer的程序:



    如果新加入c文件,不需要作修改,可以直接编译。比如说你在这个目录中加入了一个test.c,只要执行make test就可以生成一个名为test的程序。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值