我是使用make的新手,并且通过本教程学习了基础知识.这是教程中最后一个示例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)/*~
Run Code Online (Sandbox Code Playgroud)
这应该可以正常工作,假设所有.c文件只包含hellomake.h,但如果每个.c文件包含不同的标题,它将无法正常工作.是否可以编写一个知道每个.c文件包含什么的makefile,所以我不必像以下那样手动执行:
foo.o: foo.c something.h
...
bar.o: bar.c somethingelse.h
...
Run Code Online (Sandbox Code Playgroud)
因为这似乎是浪费大量时间.
Bet*_*eta 14
假设foo.c有一条线:
#include "something.h"
Run Code Online (Sandbox Code Playgroud)
你想在makefile中添加一行:
foo.o: foo.c something.h
Run Code Online (Sandbox Code Playgroud)
gcc编译器可以为您构造该行.命令
gcc -MMD -c -o foo.o foo.c
Run Code Online (Sandbox Code Playgroud)
将构建foo.o和foo.d包含该行.(试试吧.)
所以只需修改你的makefile来生成这些*.d文件并包含它们,你就完成了:
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -MMD -c -o $@ $< $(CFLAGS)
-include $(ODIR)/*.d
Run Code Online (Sandbox Code Playgroud)
(可以进一步改进,比如指定*.d文件的位置.)
| 归档时间: |
|
| 查看次数: |
8360 次 |
| 最近记录: |