首页 > 解决方案 > 在简化 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

标签: cmakefile

解决方案


制作一个基于通用变量的 Makefile,这样当您修改一个变量时,文件将自动定位并自动编译

下面的示例允许您仅修改OBJS变量所有相应的文件自动添加到最终 gcc 或 g++ 命令

意味着如果你设置P3_MakeDemo.o ma.oOBJS会自动选择P3_MakeDemo.cma.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++,那么这个文件大小甚至可以减少行数,也可以删除调试标志,这将再次减少行数


推荐阅读