c ++ makefile具有多个程序,自动检测源文件

时间:2014-03-04 07:32:11

标签: c++ makefile detect

我最近失去了5个小时来弄清楚如何编写我需要的makefile。我不是一个信息学家或程序员,所以我想对我的工作做一些评论。我已经在不同的网站上看了很多但仍然......

我需要一个创建不同可执行文件的makefile:prog1prog2 ...

要创建.o文件,因为我有许多具有许多依赖项的文件,我不想全部指定它们。所以我想/需要使用带有模式规则的自动变量。为了加快编译速度,我还要注意只重新编译修改过的文件。我通过使用-MD标志来实现此目的,该标志创建了.d目录中保存的$(BUILD)文件。

我仍然无法自动检测哪些.o文件prog1需要。所以现在我必须自动指定它们......如果你知道如何自动指定它们......

我还想将.o文件保存在$(BUILD)目录中,但我无法使其正常工作。

欢迎任何建议! THX

CXX = g++

ERRORS = -Wall -Wextra -pedantic
LAPACK = -llapack -lblas
OPTION = -O3 -fopenmp

CXXFLAGS = $(LAPACK) $(ERRORS) $(OPTION)
LDFLAGS  = $(LAPACK) $(ERRORS) $(OPTION)

BUILD=build
SRCS=(wildcard *.cpp)

all:prog1 prog2 ...

prog1:prog1.o dep_only_for_prog_1.o dep_for_all_progs.o dep_for_some_progs.o
    $(CXX) -o $@ $^ $(LDFLAGS) $(NOASSERT)

prog2:prog2.o dep_only_for_prog_2.o dep_for_all_progs.o dep_for_some_progs.o
    $(CXX) -o $@ $^ $(LDFLAGS) $(NOASSERT)

...

%.o:%.cpp
    $(CXX) -MD -c $(CXXFLAGS) $(NOASSERT)  $< -o $@
    mv $(<:.cpp=.d) $(BUILD)

-include $(addprefix $(BUILD)/$(SRCS:.cpp=.d))

clean:
    rm -f *.o $(BUILD)/*

1 个答案:

答案 0 :(得分:1)

你无法得到make来推断哪些文件属于哪些程序,但是你可以使你的makefile更易于阅读和更新。此外,您还有一些不好的事情,例如将$(LAPACK)(包含链接器标志)添加到$(CXXFLAGS)(传递给编译器)。

尝试:

PROGRAMS = prog1 prog2

prog1_SOURCES = prog1.cpp dep_only_for_prog_1.cpp \
                dep_for_all_progs.cpp dep_for_some_progs.cpp

prog2_SOURCES = prog2.cpp dep_only_for_prog_2.cpp \
                dep_for_all_progs.cpp dep_for_some_progs.cpp

#----- Don't need to change below here

CXX = g++

ERRORS = -Wall -Wextra -pedantic
LAPACK = -llapack -lblas
OPTION = -O3 -fopenmp

CXXFLAGS = $(ERRORS) $(OPTION)
LDFLAGS  = $(LAPACK) $(ERRORS) $(OPTION)

BUILD=build
SRCS := $(wildcard *.cpp)

all: $(PROGRAMS)

.SECONDEXPANSION:
$(PROGRAMS): $$($$@_SOURCES:%.cpp=%.o)
        $(CXX) -o $@ $^ $(LDFLAGS) $(NOASSERT)

%.o : %.cpp
        $(CXX) -MD -c $(CXXFLAGS) $(NOASSERT)  $< -o $@
        mv $(<:.cpp=.d) $(BUILD)

-include $(addprefix $(BUILD)/$(SRCS:.cpp=.d))

clean:
        rm -f *.o $(BUILD)/*

或者你可以根据需要使用eval。