当前位置:
首页 >
make 学习体会(一)
发布时间:2025/7/14
38
豆豆
生活随笔
收集整理的这篇文章主要介绍了
make 学习体会(一)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
在对makefile进行了部分学习后,感觉到还是多看看简短的例子比较好。
发现下面这个网站讲得很好:
http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
hellomake.c:
复制代码 #include int main() { // call a function in another file myPrintHelloMake();
return(0); } 复制代码 hellofunc.c:
复制代码 #include #include
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return; } 复制代码 hellomake.h:
/* example include file */ void myPrintHelloMake(void); 第一个 makefile的例子:
hellomake: hellomake.c hellofunc.c gcc -o hellomake hellomake.c hellofunc.c -I. hellomake 是规则名;它的前提条件是:hellomake.c 和 hellofunc.c。
在此规则中,我们要执行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I
第二个 makefile的例子:
CC=gcc CFLAGS=-I.
hellomake: hellomake.o hellofunc.o $(CC) -o hellomake hellomake.o hellofunc.o -I. 此处定义了 变量 cc 和 CFLAGS , 这也是很多 makefile中很常见的两个变量。
此时,规则 hellomake 依赖于两个目标文件 hellomake.o 和 hellofunc.o ,
而且这里有一个隐含的依赖关系:
hellomake.o 来自于对 hellomake.c 的编译
hellofunc.o 来自于 对 hellofunc.c 的编译
由于为了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,
就意味着实际上需要 hellomake.c 和 hellofunc.c。
$(CC) 就代表了 gcc 命令,此处实际上还尚未使用 CFLAGS 变量。
第三个 makefile例子:
复制代码 CC=gcc CFLAGS=-I. DEPS = hellomake.h
%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: hellomake.o hellofunc.o gcc -o hellomake hellomake.o hellofunc.o -I. 复制代码 %.o: 规则表明:每一个 .o 文件,都是依赖于 同名的 .c 文件,和 DEPS 所定义的头文件。
具体为了生成此 .o 文件,需要进行编译动作:
$(CC) -c -o $@ $< $(CFLAGS)
其中 $(CC) 和 -c -o 都不用解释了。
$@表示的就是 冒号左边的内容,即某个.o 文件。
$<表示的就是 冒号右边的第一个参数,即此同名的.c 文件。
$(CFLAGS) 在这里就是 -I。
第四个 makefile例子:
复制代码 CC=gcc CFLAGS=-I. DEPS = hellomake.h OBJ = hellomake.o hellofunc.o
%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ) gcc -o $@ $^ $(CFLAGS) 复制代码 同上个例子相比,它又定义两个 OBJ变量。
hellomake 依赖于 OBJ变量所指代的目标文件,
gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解释了。
$^ 是冒号右边的值,这里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。
第五个 makefile例子:
复制代码 IDIR =../include CC=gcc CFLAGS=-I$(IDIR)
ODIR=obj LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ) gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean: rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 复制代码 这里面 IDIR,LDIR,ODIR 分别指定了 头文件/库文件/输出目标文件的目录。
来看这一句:
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) patsubst 是一个 函数,它会把所有 % 所代表的文件字符串,改变为 头文件目录下的 文件字符串。
第三个参数 $(_DEPS)指明了这个 函数的作用范围。
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法与此类似。
其他的,也没有什么可以说的了,但是 这里有一个伪规则 clean。它是没有前提条件的。
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,
*~ , 我猜测代表的是 所有没有扩展名的文件。core 指代的是程序出错时生成的 core 文件。
标签: Makefile, example
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/17/2688165.html,如需转载请自行联系原作者
发现下面这个网站讲得很好:
http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
hellomake.c:
复制代码 #include int main() { // call a function in another file myPrintHelloMake();
return(0); } 复制代码 hellofunc.c:
复制代码 #include #include
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return; } 复制代码 hellomake.h:
/* example include file */ void myPrintHelloMake(void); 第一个 makefile的例子:
hellomake: hellomake.c hellofunc.c gcc -o hellomake hellomake.c hellofunc.c -I. hellomake 是规则名;它的前提条件是:hellomake.c 和 hellofunc.c。
在此规则中,我们要执行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I
第二个 makefile的例子:
CC=gcc CFLAGS=-I.
hellomake: hellomake.o hellofunc.o $(CC) -o hellomake hellomake.o hellofunc.o -I. 此处定义了 变量 cc 和 CFLAGS , 这也是很多 makefile中很常见的两个变量。
此时,规则 hellomake 依赖于两个目标文件 hellomake.o 和 hellofunc.o ,
而且这里有一个隐含的依赖关系:
hellomake.o 来自于对 hellomake.c 的编译
hellofunc.o 来自于 对 hellofunc.c 的编译
由于为了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,
就意味着实际上需要 hellomake.c 和 hellofunc.c。
$(CC) 就代表了 gcc 命令,此处实际上还尚未使用 CFLAGS 变量。
第三个 makefile例子:
复制代码 CC=gcc CFLAGS=-I. DEPS = hellomake.h
%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: hellomake.o hellofunc.o gcc -o hellomake hellomake.o hellofunc.o -I. 复制代码 %.o: 规则表明:每一个 .o 文件,都是依赖于 同名的 .c 文件,和 DEPS 所定义的头文件。
具体为了生成此 .o 文件,需要进行编译动作:
$(CC) -c -o $@ $< $(CFLAGS)
其中 $(CC) 和 -c -o 都不用解释了。
$@表示的就是 冒号左边的内容,即某个.o 文件。
$<表示的就是 冒号右边的第一个参数,即此同名的.c 文件。
$(CFLAGS) 在这里就是 -I。
第四个 makefile例子:
复制代码 CC=gcc CFLAGS=-I. DEPS = hellomake.h OBJ = hellomake.o hellofunc.o
%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ) gcc -o $@ $^ $(CFLAGS) 复制代码 同上个例子相比,它又定义两个 OBJ变量。
hellomake 依赖于 OBJ变量所指代的目标文件,
gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解释了。
$^ 是冒号右边的值,这里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。
第五个 makefile例子:
复制代码 IDIR =../include CC=gcc CFLAGS=-I$(IDIR)
ODIR=obj LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ) gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean: rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 复制代码 这里面 IDIR,LDIR,ODIR 分别指定了 头文件/库文件/输出目标文件的目录。
来看这一句:
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) patsubst 是一个 函数,它会把所有 % 所代表的文件字符串,改变为 头文件目录下的 文件字符串。
第三个参数 $(_DEPS)指明了这个 函数的作用范围。
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法与此类似。
其他的,也没有什么可以说的了,但是 这里有一个伪规则 clean。它是没有前提条件的。
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,
*~ , 我猜测代表的是 所有没有扩展名的文件。core 指代的是程序出错时生成的 core 文件。
标签: Makefile, example
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/17/2688165.html,如需转载请自行联系原作者
总结
以上是生活随笔为你收集整理的make 学习体会(一)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: ssm整合(基于xml配置方式)
- 下一篇: 【单页应用】全局控制器app应该干些什么