makefile中的规则模式
显示规则:所有的规则都是明确无二义性的。
BIN = hello
CXX = g++
CCFLAG = -g -Wall -Wshadow
OBJ = hello.o
all:clean $(BIN)
clean:
rm $(OBJ) -rf
rm $(BIN) -rf
$(BIN):$(OBJ)
$(CXX) $(CCFLAG) -o $(BIN) $(OBJ)
$(OBJ):
$(CXX) $(CCFLAG) -o $(OBJ) -c hello.cpp
$ make
rm hello.o -rf
rm hello -rf
g++ -g -Wall -Wshadow -o hello.o -c hello.cpp
g++ -g -Wall -Wshadow -o hello hello.o
隐式规则:有些规则是系统默认的,例如.o文件,系统已经制定了规则它是由.c或者.cpp生成的。
BIN = hello
CXX = g++
CCFLAG = -g -Wall -Wshadow
OBJ = hello.o
all:clean $(BIN)
clean:
rm $(OBJ) -rf
rm $(BIN) -rf
$(BIN):$(OBJ)
$(CXX) $(CCFLAG) -o $(BIN) $(OBJ)
$ make
rm hello.o -rf
rm hello -rf
g++ -c -o hello.o hello.cpp
g++ -g -Wall -Wshadow -o hello hello.o
可以看到上述“g++ -c –o hello.o hello.cpp”就是使用了隐式规则。一般来说,我们希望自己控制编译过程,应该尽量避免使用隐式规则。
模式规则:自己定义的能够满足一系列模式的规则。
BIN = hello
CXX = g++
CCFLAG = -g -Wall -Wshadow
OBJ = hello.o
all:clean $(BIN)
clean:
rm $(OBJ) -rf
rm $(BIN) -rf
$(BIN):$(OBJ)
$(CXX) $(CCFLAG) -o $(BIN) $(OBJ)
%.o:%.cpp
$(CXX) $(CCFLAG) -o $@ -c $<
$ make
rm hello.o -rf
rm hello -rf
g++ -g -Wall -Wshadow -o hello.o -c hello.cpp
g++ -g -Wall -Wshadow -o hello hello.o
可以看到“%o:%cpp”指定了一个模式。
$@和$<是自动变量:
$@表示目标文件;
$<表示第一个依赖;
$^表示所有依赖;
常见工具:
nm(-g):查看动态库或者静态库里的符号表;
ldd(bin):查看二进制程序用到了哪些库;
评论关闭。