gpt4 book ai didi

c++ - 多个目标的Makefile优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:26 26 4
gpt4 key购买 nike

因此,作为我用 C++ 制作的一些工具的一部分,我希望能够单独测试每个工具。有多个工具和多个测试文件,因此我想要多个可执行文件作为我的最终结果。我希望 Makefile 的魔力能让我的生活更轻松。

这是我当前的 Makefile 模板:

# Compilation
CXX = g++
CXXFLAGS = -pedantic -Wall -c # -g -Wextra

all: lbLog lbString

lbLog:
$(CXX) $(CXXFLAGS) 'src/lbLog.cpp' -o lbLog.o
$(CXX) 'examples/lbLog_example.cpp' lbLog.o -o 'tests/lbLog_example'
rm lbLog.o

lbString:
$(CXX) $(CXXFLAGS) 'src/lbString.cpp' -o lbString.o
$(CXX) 'examples/lbString_example.cpp' lbString.o -o 'tests/lbString_example'
rm lbString.o

预期的文件结构是

  • 驱动程序示例文件在“/examples”(.cpp) 中
  • 源/工具 (.cpp) 在 '/src' 中
  • “/include”中的标题
  • 在'/tests'中输出exe

所以问题是,是否有优化 makefile 的方法,让我几乎可以“一劳永逸”?我不想满怀希望地将每个新工具都添加到 Makefile 中。因为它是如此重复的模式,所以必须有办法让它变得更聪明。

最佳答案

这根本不是一个合适的 makefile。它没有指定 make 可以利用的任何先决条件/目标对。

要利用 make 为您做的事情,您需要更像这样的东西:

# Compilation
CXX = g++
CXXFLAGS = -pedantic -Wall -c # -g -Wextra

all: tests/lbLog_example tests/lbString_example

lbLog.o: src/lbLog.cpp
$(CXX) $(CXXFLAGS) $^ -o $@

tests/lbLog_example: examples/lbLog_example.cpp lbLog.o
$(CXX) $^ -o $@

lbString.o: src/lbString.cpp
$(CXX) $(CXXFLAGS) $^ -o $@

tests/lbString_example: examples/lbString_example.cpp lbString.o
$(CXX) $^ -o $@

这告诉 make 默认构建测试可执行文件,并且测试可执行文件依赖于顶层目标文件以及如何从它们各自的源构建目标文件。现在 make 知道它需要在目标文件的先决条件文件发生变化时重建目标文件,而不是其他情况(与总是重新编译所有内容的原始文件相反)。

您甚至可以使用 pattern rules 进一步清理它像这样:

# Compilation
CXX = g++
CXXFLAGS = -pedantic -Wall -c # -g -Wextra

all: tests/lbLog_example tests/lbString_example

lb%.o: src/lb%.cpp
$(CXX) $(CXXFLAGS) $^ -o $@

tests/lb%_example: examples/lb%_example.cpp lb%.o
$(CXX) $^ -o $@

如果您允许在 src 目录中构建目标文件,您也可以完全删除 lb%.o: src/lb%.cpp 规则。在 examples 目录中构建测试可执行文件,我相信您可以从 tests/lb%_example 中删除 $(CXX) $^ -o $@ 正文: examples/lb%_example.cpp lb%.o 目标也将以这个(未经测试的)makefile 结尾,我相信:

# Compilation
CXX = g++
CXXFLAGS = -pedantic -Wall -c # -g -Wextra

all: tests/lbLog_example tests/lbString_example

tests/lb%_example: examples/lb%_example.cpp lb%.o

这最后一点有效(假设我没问题)因为 make 带有许多 built-in rules对于常见的构建模式。

关于c++ - 多个目标的Makefile优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31431730/

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