文件目录结构
当前目录
————————————————————————main.c
|
|
|——————————hed目录
| |
| |____________hed.h
|
|______________src目录
| |
| |____________src.c
|
|
头文件
/* hed/hed.h */
#include<stdio.h>
//这里担心会不会和main.c文件中的冲突。。。
#ifndef __HED_H__
#define __HED_H__
int print(char* str);
#endif
源文件
/* src/src.c */
int print(char *str)
{
printf("%s\n",str);
return 0;
}
main文件
/* main.c*/
#include"hed.h"
int main(void)
{
char str[] = "asdfdsfhj";
print(str);
return 0;
}
make文件
# CFLAGS = -Ihed -O2 # -I头文件搜索路径,-O2优化
# VPATH = src # 源文件搜索路径,用:分隔各个路径
# OBJS = src.o main.o # 目标文件依赖的obj文件
# TARGET = prt # 目标文件
# CC = gcc
# RM = rm -f # 删除命令
# $(TARGET):$(OBJS)
# $(CC) -o $(TARGET) $(OBJS) $(CFLAGE)
# clean:
# -$(RM) $(TARGET) $(OBJS
# # 没有指定OBJS文件的规则,make自动按照隐含规则形成一个规则来生成obj文件
# # 这样所有的obj文件全部在程序根目录中
## 新版make
# 函数说明
# foreach函数分别将$(DIRS)中以一个空格分隔的单词,先传递给临时变量dir,再执行$(wildcard $(dir)/*.c)命令,返回以空格分隔的所有执行结果
# wildcard函数查找当前目录下所有符合$(dir)/*.c的文件名,返回以空格分隔的所有符合模式的文件名
# patsubst函数将$(FILES)中所有符合模式%.c的字符替换为%.o,其中%代表0-n个字符
CC = gcc
RM = rm -f
CFLAGS = -O2 -Ihed
TARGET = prt
DIRS = src .
FILES = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.c))
OBJS = $(patsubst %.c,%.o,$(FILES))
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS)
clean:
-$(RM) $(TARGET)
-$(RM) $(OBJS) # "-"表示操作失败时不报错,命令继续执行
运行结果
$ make
gcc -O2 -Ihed -c -o src/src.o src/src.c
src/src.c: In function ‘print’:
src/src.c:10:2: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
printf("%s\n",str);
^~~~~~
src/src.c:10:2: warning: incompatible implicit declaration of built-in function ‘printf’
src/src.c:10:2: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
gcc -O2 -Ihed -c -o main.o main.c
gcc -o prt src/src.o ./main.o
$ ./prt
asdfdsfhj