c - 在简化 C 中的 make 文件方面需要帮助
问题描述
我写了一个make文件C,但我需要尽可能地简化它,因为它很长有什么帮助吗?
# Makefile for makedemo
bin/Debug/P3_MakeDemo: bin bin/Debug bin/obj bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/obj/main.o
gcc -o bin/Debug/P3_MakeDemo bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/obj/main.o -Wall -g -pedantic --std=c99
bin/Debug/P3_MakeDemo
bin/obj: bin/
mkdir bin/obj
bin/Debug: bin/
mkdir bin/Debug
bin:
mkdir bin
bin/obj/ma.o: src/ma.c
gcc -I include -c src/ma.c -o bin/obj/ma.o -Wall -g -pedantic --std=c99
bin/obj/mb.o: src/mb.c
gcc -I include -c src/mb.c -o bin/obj/mb.o -Wall -g -pedantic --std=c99
bin/obj/mc.o: src/mc.c
gcc -I include -c src/mc.c -o bin/obj/mc.o -Wall -g -pedantic --std=c99
bin/obj/md.o: src/md.c
gcc -I include -c src/md.c -o bin/obj/md.o -Wall -g -pedantic --std=c99
bin/obj/main.o: src/main.c
gcc -I include -c src/main.c -o bin/obj/main.o -Wall -g -pedantic --std=c99
clean:
rm -rf bin/Debug/P3_MakeDemo
rm -rf bin/obj/ma.o
rm -rf bin/obj/mb.o
rm -rf bin/obj/mc.o
rm -rf bin/obj/md.o
rm -rf bin/obj/main.o
rm -rf bin/obj
rm -rf bin
debug_off:
sed -i -e 's/#define DEBUG/#undef DEBUG/g' include/globals.h
debug_on:
sed -i -e 's/#undef DEBUG/#define DEBUG/g' include/globals.h
dochtml:doc
cd doc; doxygen
docclean:
rm -rf doc/html
doc:
mkdir doc
test: bin bin/Debug/test bin/obj bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/Debug/test
bin/Debug/test
bin/Debug/test:test/main.o
gcc -l cunit -o bin/Debug/test bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o test/main.o -Wall -g -pedantic --std=c99
test/main.o: test/main.c
gcc -I include -c test/main.c -o test/main.o -Wall -g -pedantic --std=c99
testclean:
rm test/main.o
rm bin/exec/test
.PHONY: test
解决方案
制作一个基于通用变量的 Makefile,这样当您修改一个变量时,文件将自动定位并自动编译
下面的示例允许您仅修改OBJS
变量所有相应的文件自动添加到最终 gcc 或 g++ 命令
意味着如果你设置P3_MakeDemo.o ma.o
它OBJS
会自动选择P3_MakeDemo.c
和ma.c
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
OBJS = P3_MakeDemo.o ma.o
CXX = g++
CC = gcc
BUILD_MODE = debug
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif
all: P3_MakeDemo
P3_MakeDemo: $(OBJS)
$(CXX) -o $@ $^
%.o: $(PROJECT_ROOT)%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
%.o: $(PROJECT_ROOT)%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
clean:
rm -fr P3_MakeDemo $(OBJS)
当你运行时,make all
你会看到类似的输出
make all
gcc -c -g -o P3_MakeDemo.o /project/P3_MakeDemo/P3_MakeDemo.c
gcc -c -g -o ma.o /project/P3_MakeDemo/ma.c
g++ -o P3_MakeDemo P3_MakeDemo.o ma.o
这允许您在项目中添加任意数量的 .c 或 .cpp,而无需在 Makefile 脚本中进行太多更改
如果您不想要 CPP/C++,那么这个文件大小甚至可以减少行数,也可以删除调试标志,这将再次减少行数
推荐阅读
- angular - 反应式表单不显示在 html 中
- python-3.x - 在 Chrome 中打开链接后,我可以终止 Webbrowser 实例吗?
- gcc - 使用 GCC 编译器编译 RISC-V 代码
- ruby-on-rails - 在 Rails 应用程序中将“belongs_to”添加到模型后测试失败
- ios - Combine + SwiftUI 中的最佳数据绑定实践?
- python - 如何在Python中同时为两个数组选择矩阵中的元素?
- dialogflow-es - google user.storage 上的操作会随着用户的每个帖子调用而清除 - 在相同的覆盖范围内。我如何保存对话的数据?
- javascript - 无法阻止甜蜜警报关闭
- python - Python3:无法将 CSV 文件导入我的 Jupyter Notebook - 请参阅下面的特定错误和屏幕截图
- sql-server - 如何根据条件制作 Row_number()?