C语言 makefile 编译 指定源文件,头文件目录
2022-0117 blog_11
-
首先设计一个简单的C语言项目的文件结构
makePro main.c main_api.c main_api.h inc(头文件目录) make_add.h src(源文件目录) make_add.c
-
给源文件和头文件添加代码
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;
}
- 编写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)
- 重点语句解释
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”
-
运行结果
-
参考资料
《跟我一起写makefile》
https://blog.csdn.net/weixin_39627697/article/details/110837041(这篇文章给我很大启发,感谢博主)