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

标签 c++ makefile detect

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

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

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

我仍然不能做的是自动检测.o 文件prog1 需要。所以现在我必须自动指定它们...如果您知道如何自动执行...

我还想将 .o 文件保存在 $(BUILD) 目录中,但我不能让它工作。

欢迎任何建议! 谢谢

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)/*

最佳答案

您无法让 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。

关于具有多个程序的c++ makefile,源文件的自动检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165625/

相关文章:

c++ - c++定义前通过调用类初始化对应的类

c++ - OpenGL 着色器的 .HLSL 文件

c++ - 测试多个变量值是否全部为正或负

c - Makefile 未执行,错误需要符号

javascript - 如何在 JavaScript 中检测浏览器对 Flash 的支持?

C++如何检测显卡型号

c++ - 帮助解决错误

makefile - 如何从终端覆盖 makefile 中的变量

c# - 如何在 C# 项目中使用 Clang?

python - 我如何检测识别形状中的文本