gpt4 book ai didi

makefile - 使用与源代码不同的构建结构使用 Gnu Make 实用程序自动制作文件

转载 作者:行者123 更新时间:2023-12-04 06:18:52 26 4
gpt4 key购买 nike

我已经看到以下技术用于自动编译特定目录中的所有 C(或 C++,或者我想你想要的任何扩展名)文件。

SOURCE_DIRS = .
SOURCES := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.cpp)))
HEADERS := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.h)))
OBJECTS := $(addprefix build/,$(SOURCES:.cpp=.o))
CXX = g++
CXXFLAGS = -Wall -pedantic -g
#LDFLAGS =

all: build/exe_name

build/exe_name: $(OBJECTS)
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)

build/%.o: %.cpp $(HEADERS) Makefile
mkdir -p $(dir $@)
$(CXX) -o $@ $(CXXFLAGS) -c $<

唯一的问题是它以与源目录中相同的结构构建所有文件。因此,如果您有一个包含代码的子文件夹,那么构建将有一个匹配的子文件夹。

那么,我该如何修改它(或其他什么可以做),以将所有输出的目标直接放置在 build/目录中,而不是放置在与源目录匹配的层次结构中?

我曾想过尝试删除在目标中使用时可能出现在 '%' 中的任何目录,但我找不到任何好的命令来做到这一点。此外,在创建时尝试更改 OBJECTS 路径似乎有点问题,因为我不知道 '%' 变量如何读取它,除了它神奇地编译 OBJECTS 列表中的所有内容。

感谢您提供的任何帮助。

最佳答案

为了,

  • 我不明白这是如何工作的。您的通配符方法不会递归到源文件夹的子文件夹中,并且您的 %.o 规则在除“SOURCE_DIRS=.”之外的任何情况下都不起作用。
  • 你的 %.o 规则有点松散。如果你改变一个头文件,Make 将重建所有的目标文件。
  • 将可以找到的每个源都合并到您的可执行文件中可能并不明智。在这种方案中,很难有多个共享代码的可执行文件。
  • 为了克服 1) 的问题并编写一个我可以测试的 makefile,我将不得不使用我讨厌的“查找”,因此以下内容未经测试。
  • 我认为这会做到(在 GNUMake 中):
  • SOURCES := whatever...
    vpath %.cpp $(dir $(SOURCES))
    SOURCES := $(notdir $(SOURCES))

    关于makefile - 使用与源代码不同的构建结构使用 Gnu Make 实用程序自动制作文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6866963/

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