makefile之规则模式

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):查看二进制程序用到了哪些库;

评论关闭。