- 论坛徽章:
- 0
|
本帖最后由 fuyinyuezhang 于 2016-05-18 13:56 编辑
先看下目录结构:
- # tree
- .
- ├── bin
- ├── Makefile
- ├── objs
- └── src
- ├── Httpkit.cpp
- ├── Httpkit.h
- └── main.cpp
复制代码 然后是 Makefile 。其中我重新定义了 %.o:%.cpp 的规则,这样可以把生成的动态链接库文件放到 objs 目录下。
- CXX = g++
- CXXFLAGS = -std=c++11 -Wall -Werror
- CFLAGS = -lcurl -lcurlpp
- SRC_DIR = ./src
- OBJS_DIR = ./objs
- BIN_DIR = ./bin
- vpath %.cpp $(SRC_DIR)
- vpath %.h $(SRC_DIR)
- vpath %.o $(OBJS_DIR)
- %.o: %.cpp
- $(CXX) $(CXXFLAGS) -c -o $(OBJS_DIR)/$@ $^
- .PHONY: default clean
- default: HttpKit
- main.o: main.cpp
- Httpkit.o: Httpkit.cpp
- HttpKit: main.o Httpkit.o
- $(CXX) $(CXXFLAGS) $(CFLAGS) -o $(BIN_DIR)/$@ $^
- clean:
- -rm -rf $(OBJS_DIR)/*
- -rm -rf $(BIN_DIR)/*
复制代码 执行 make 的结果:
- g++ -std=c++11 -Wall -Werror -c -o ./objs/main.o ./src/main.cpp
- g++ -std=c++11 -Wall -Werror -c -o ./objs/Httpkit.o ./src/Httpkit.cpp
- g++ -std=c++11 -Wall -Werror -lcurl -lcurlpp -o ./bin/HttpKit main.o Httpkit.o #注意这行
- g++: error: main.o: No such file or directory
- g++: error: Httpkit.o: No such file or directory
- Makefile:21: recipe for target 'HttpKit' failed
- make: *** [HttpKit] Error 1
复制代码 上面我标注释的这行输出,虽然自动推导展开了依赖参数,但是依赖的路径完全没有按照 vpath 进行补全。奇怪的是,上面两个生成动态链接库(.o 后缀的文件)的规则也是这样的写法,却完全正确地补全了!
但是,此时 objs 目录下已经有了两个 .o 文件,再执行 make ,直接只有一行输出:
- g++ -std=c++11 -Wall -Werror -lcurl -lcurlpp -o ./bin/HttpKit ./objs/main.o ./objs/Httpkit.o
复制代码 WTF ?!?!?!
现在我有两个问题:
1 ,究竟为什么第一次 make 无法按照 vpath 变量的值自动展开路径,第二次直接就可以了?
2 ,生成最终二进制文件的命令能否也定义成隐含规则自动推导(这个意义不大,但是主要还是学习下 Makefile ,并且最终二进制文件并没有后缀名)?
src.rar
(1.63 KB, 下载次数: 7)
|
|