同一文件含多个对象时,Makefile两种写法哪个正确?
Makefile写法选择建议
先明确你的项目场景:
/ ├─/src │ ├─objects_file.cpp │ └─objects_file.hpp └─/testing └─test_objects.cpp
其中objects_file.cpp里包含了Object1和Object2两个对象的实现。
直接给结论:写法一是正确的,写法二不可行,原因如下:
对于写法一:
Make的依赖是基于源文件对应的目标文件来管理的。你只有objects_file.cpp这一个源文件,编译后只会生成objects_file.o这一个目标文件——不管这个源文件里写了多少个类、多少个对象,单个源文件对应单个目标文件是C/C++编译的基本逻辑。所以把objects_file.o作为test_objects的依赖是完全合理的,Make能正确找到这个目标文件(前提是你有对应的规则生成它,或者Make用默认规则帮你生成)。对于写法二:
这里依赖Object1.o和Object2.o是完全错误的。你的项目里根本不存在Object1.cpp和Object2.cpp这两个源文件,Make找不到任何规则来生成这两个目标文件,执行时会直接报错“找不到Object1.o/Object2.o”。Make不会把单个源文件拆分成多个对应内部对象的目标文件,这不是它的工作逻辑。
另外给你一个更规范的Makefile写法参考,能更好地管理目录结构,避免目标文件乱放在根目录:
# 指定C++编译器 CXX := g++ # 定义目录变量 SRC_DIR := src TEST_DIR := testing # 定义需要编译的目标文件 CORE_OBJS := $(SRC_DIR)/objects_file.o # 生成测试程序的规则 test_objects: $(CORE_OBJS) $(CXX) -o test_objects.bin $(TEST_DIR)/test_objects.cpp $(CORE_OBJS) # 生成objects_file.o的规则(明确依赖头文件,修改头文件时会重新编译) $(SRC_DIR)/objects_file.o: $(SRC_DIR)/objects_file.cpp $(SRC_DIR)/objects_file.hpp $(CXX) -c $< -o $@ # 清理生成的文件 clean: rm -f $(CORE_OBJS) test_objects.bin
内容的提问来源于stack exchange,提问作者aLex
相关产品推荐
相关产品推荐

