C语言 makefile 编译 指定源文件,头文件目录

C语言 makefile 编译 指定源文件,头文件目录

2022-0117 blog_11

  1. 首先设计一个简单的C语言项目的文件结构

     makePro
     	main.c
     	main_api.c
     	main_api.h
     	inc(头文件目录)
     		make_add.h
     	src(源文件目录)
     		make_add.c
    
  2. 给源文件和头文件添加代码

main.c

// main.c
#include <stdio.h>

#include "main_api.h"
#include "make_add.h"

int main()
{
	printf("main() \n");

	main_api();

	make_add(12, 15);

	return 0;
}

main_api.h

#ifndef _MAIN_API_H_
#define _MAIN_API_H_

void main_api();

#endif		// main_api.h

main_api.c

// main_api.c
#include "main_api.h"

#include <stdio.h>

void main_api()
{
	printf("main_api() \n");
}

make_add.h

#ifndef _MAKE_ADD_H_
#define _MAKE_ADD_H_

int make_add(int a, int b);

#endif		// make_add.h

make_add.c

// make_add.c
#include "make_add.h"

#include <stdio.h>

int make_add(int a, int b)
{
	printf("make_add(%d, %d) = %d \n", a, b, a + b);
	return a + b;
}

  1. 编写makefile(重点
# makefile 
VERSION = 1.0.0
CC = gcc
TARGET = app_makefile_test
DEBUG = -Wall -c

src_path = ./ ./src/
src = $(foreach dir, $(src_path), $(wildcard $(dir)*.c))

obj_name = $(patsubst %.c, %.o, $(src))

INC = -I./
INC += -I./inc/ 


$(TARGET) : $(obj_name) 
	$(CC) $(obj_name) -o $(TARGET)	 
	@echo "\nmakefile compile version :$(VERSION), target :$(TARGET)\n"

%.o : %.c
	$(CC) $(DEBUG) $(INC) $^ -o $@ 
	
.PHONY :
clean :
	@echo "start clean target and objects \n"
	rm $(TARGET) $(obj_name)

  1. 重点语句解释
src = $(foreach dir, $(src_path), $(wildcard $(dir)*.c))

$(foreach var,list ,text)
这个函数的意思是,把参数list中的单词逐一取出放到参数var所指定的变量中,然后再执行text所包含的表达式。每一次text会返回一个字符串,循环过程,text的所返回的每个字符串会以空格分隔,最后当整个循环结束时,text所返回的每个字符串所组成的整个字符串(以空格分隔)将会是 foreach 函数的返回值。

所以,var最好是一个变量名,list可以是一个表达式,而text中一般会使用var这个参数来依次枚举list中的单词。举个例子:

names := a b c d
files := $(foreach n,$(names),$(n).o)

上面的例子中,name中的单词会被挨个取出,并存到变量“n”中,“n.o”每次根
据“n”计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回,所以,
files的值是“a.o b.o c.o d.o”。
注意,foreach 中的var参数是一个临时的局部变量,foreach 函数执行完后,参数var的变量将不在作用,其作用域只在 foreach 函数当中。

obj_name = $(patsubst %.c, %.o, $(src))
$(patsubst <pattern>,<replacement>,<text>)
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)
是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。
这里,<pattern>可以包括通配符“%”,表示任意长度的字串。
如果<replacement>中也包含“%”,
那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。
(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)

返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o
bar.o”
  1. 运行结果
    在这里插入图片描述

  2. 参考资料
    《跟我一起写makefile》
    https://blog.csdn.net/weixin_39627697/article/details/110837041(这篇文章给我很大启发,感谢博主)

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值