gpt4 book ai didi

makefile - 制作更好的 Makefile

转载 作者:行者123 更新时间:2023-12-04 22:50:50 27 4
gpt4 key购买 nike

所以我前段时间了解了什么是 Makefile,创建了一个模板 Makefile,我所做的就是为我正在执行的每个程序复制和更改相同的文件。我改了几次,但它仍然是一个非常粗糙的Makefile。我应该如何改进它?这是我当前版本的示例:

CC  = g++
CFLAGS = -std=gnu++0x -m64 -O3 -Wall
IFLAGS = -I/usr/include/igraph
LFLAGS = -ligraph -lgsl -lgslcblas -lm
DFLAGS = -g -pg

# make all
all: run test

# make a fresh compilation from scratch
fresh: clean test

#makes the final executable binary
run: main.o foo1.o foo2.o
$(CC) $(CFLAGS) $(LFLAGS) $^ -o $@

#makes the test executable with debugging and profiling tags
test: test.o foo1.o foo2.o
$(CC) $(DFLAGS) $(CFLAGS) $(LFLAGS) $^ -o $@

#makes teste.o
teste.o: teste.cpp
$(CC) $(CFLAGS) $(IFLAGS) -c $^ -o $@

#makes main.o
main.o: main.cpp
$(CC) $(CFLAGS) $(IFLAGS) -c $^ -o $@

#file foo1
foo1.o: foo1.cpp
$(CC) $(CFLAGS) $(IFLAGS) -c $^ -o $@

#file foo2
foo2.o: foo2.cpp
$(CC) $(CFLAGS) $(IFLAGS) -c $^ -o $@

clean: clean-test clean-o clean-annoying

clean-test:
rm test-rfv

clean-o:
rm *.o -rfv

clean-annoying:
rm *~ -rfv

仅通过与我在网上看到的其他 makefile 进行视觉比较,这似乎不是一个非常亮的 Makefile。我不知道它们是如何工作的,但我可以看到它们中的样板代码和通用代码明显减少。

对于每个项目,这是否可以做得更好、更安全、更容易具体化?

最佳答案

如果可以的话,您不想在 makefile 中命名特定文件,并且在 99% 的情况下都可以。 This page展示了如何开发一个非常通用的 makefile。以下是我自己的 makefile,基于该页面的信息:

SHELL := bash
PROG := pathed.exe

OUTDIRS := bin/debug bin/rel obj/debug obj/rel

PROG_REL := bin/rel/$(PROG)
PROG_DEBUG := bin/debug/$(PROG)

SRCFILES := $(wildcard src/*.cpp)

OBJFILES_REL := $(patsubst src/%.cpp,obj/rel/%.o,$(SRCFILES))
OBJFILES_DEBUG := $(patsubst src/%.cpp,obj/debug/%.o,$(SRCFILES))

DEPFILES := $(patsubst src/%.cpp,obj/%.d,$(SRCFILES))

CFLAGS := -Iinc -Wall -Wextra -MMD -MP
DBFLAGS := -g
RELFLAGS :=

CC := g++

.PHONY: default all testmake debug release clean dirs

default: debug

all: dirs clean debug release

dirs:
@mkdir -p $(OUTDIRS)

debug: $(PROG_DEBUG)

release: $(PROG_REL)

testmake:
@echo OBJFILES_REL = $(OBJFILES_REL)
@echo OBJFILES_DEBUG = $(OBJFILES_DEBUG)
@echo SRCFILES = $(SRCFILES)
@echo DEPFILES = $(DEPFILES)

clean:
rm -f $(OBJFILES_REL) $(OBJFILES_DEBUG) $(DEPFILES) $(PROG)

$(PROG_REL): $(OBJFILES_REL)
$(CC) $(OBJFILES_REL) -o $(PROG_REL)
strip $(PROG_REL)
@echo "---- created release binary ----"


$(PROG_DEBUG): $(OBJFILES_DEBUG)
$(CC) $(OBJFILES_DEBUG) -o $(PROG_DEBUG)
@echo "---- created debug binary ----"

-include $(DEPFILES)

obj/rel/%.o: src/%.cpp
$(CC) $(RELFLAGS) $(CFLAGS) -MF $(patsubst obj/rel/%.o, obj/%.d,$@) -c $< -o $@

obj/debug/%.o: src/%.cpp
$(CC) $(DBFLAGS) $(CFLAGS) -MF $(patsubst obj/debug/%.o, obj/%.d,$@) -c $< -o $@

关于makefile - 制作更好的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com