需要简化C语言文件的帮助

问题描述 投票:0回答:1

我写了一个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
c makefile
1个回答
0
投票

基于通用变量的Makefile,以便在修改一个变量时,文件将自动定位并自动编译

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

表示如果将P3_MakeDemo.o ma.o设置为OBJS,它将自动选择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 ++,则该文件的大小甚至可以减少行数,也可以删除调试标志,这将再次减少行数

© www.soinside.com 2019 - 2024. All rights reserved.