You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一文件含多个对象时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:21