如何编写Makefile实现两个不同目录下C语言源文件的联合编译
跨目录C源文件联合编译Makefile实现方案
你当前的目录结构如下:
~/learn2prog/ ├── 15_tests_subseq/ │ └── test-subseq.c └── 16_subseq/ ├── maxSeq.c └── Makefile(存放位置)
你可以直接使用下面的Makefile内容实现需求,有两种实现方式可选:
方案1:使用VPATH指定源文件搜索路径(更简洁,推荐)
# 编译器配置 CC := gcc CFLAGS := -Wall -g # 如果test-subseq.c依赖的头文件也在15_tests_subseq目录下,取消下一行注释 # CFLAGS += -I../15_tests_subseq # 源文件搜索路径:添加test-subseq.c所在的上级目录下的15_tests_subseq VPATH := ../15_tests_subseq # 配置项:源文件列表、目标文件列表、最终生成的可执行文件名 SRC := test-subseq.c maxSeq.c OBJ := $(SRC:.c=.o) TARGET := subseq_test # 默认编译目标 all: $(TARGET) # 链接所有目标文件生成可执行程序 $(TARGET): $(OBJ) $(CC) $(CFLAGS) -o $@ $^ # 模式规则:自动将所有.c源文件编译为对应的.o目标文件 %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< # 清理规则:删除所有编译生成的文件 .PHONY: clean clean: rm -f $(OBJ) $(TARGET)
方案2:直接指定源文件完整相对路径
# 编译器配置 CC := gcc CFLAGS := -Wall -g # 如果有头文件在15_tests_subseq目录下,取消下一行注释 # CFLAGS += -I../15_tests_subseq # 直接写全两个源文件的相对路径(相对于Makefile所在的16_subseq目录) SRC := ../15_tests_subseq/test-subseq.c ./maxSeq.c OBJ := $(SRC:.c=.o) TARGET := subseq_test all: $(TARGET) $(TARGET): $(OBJ) $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< .PHONY: clean clean: rm -f $(OBJ) $(TARGET)
使用方法
- 将上面任意一种方案的内容复制,保存到
~/learn2prog/16_subseq/目录下,命名为Makefile - 打开终端,切换到Makefile所在目录:
cd ~/learn2prog/16_subseq - 执行编译命令:
make - 编译完成后运行生成的可执行程序:
./subseq_test - 如需删除编译生成的.o文件和可执行文件,执行:
make clean
内容的提问来源于stack exchange,提问作者user3120824
相关产品推荐
相关产品推荐

