gpt4 book ai didi

Makefiles,从另一个带有 obj 文件的文件夹构建源代码到当前的子文件夹中?

转载 作者:行者123 更新时间:2023-12-01 12:39:09 26 4
gpt4 key购买 nike

背景

我已经在这个问题上停留了一段时间,所以真的希望有人能提供帮助!我有一组 C/C++ 源文件夹,它们是几个项目的通用代码,还有一些包含项目本身的文件夹(在其他文件夹旁边)。

当我构建一个项目时,我希望能够包含来自外部文件夹的 sources.mk,并将这些包含的源的对象放入项目目录的子文件夹中,以免使公共(public)文件夹困惑具有特定于项目的对象(每个项目可以有不同的标志、优化等)

例如,这是一个文件夹结构:

source/common.mk
source/common/stuff/aaa.c
source/common/stuff/sources.mk
source/projects/thing/main.c
source/projects/thing/Makefile

projects/thing 中的 Makefile 将包含 ../../common/stuff/sources.mk 以获取该文件夹中的源列表(附加到 Makefile 中已有的源列表),并将包含 ../../common.mk 以获取从 .c 生成 .o 的规则。

sources.mk 中的 Sources 前面加上 Makefile 和 sources.mk 之间的相对路径,如下所示:

THIS_TOP := $(dir $(lastword $(MAKEFILE_LIST)))
SOURCES_C += $(THIS_TOP)/aaa.c

我希望所有对象都进入(我正在构建的目录)/objdir/,最好使用基于源路径的子文件夹,例如:

cd projects/thing; make

应该创建:

projects/thing/objdir/main.o
projects/thing/objdir/common/stuff/aaa.o

因此,我制作了一个目标文件列表并从相对路径中删除 ../,如下所示:

__OBJECTS=$(SOURCES_C:.c=.o) $(SOURCES_CPP:.cpp=.o)
_OBJECTS = $(subst ../,,$(__OBJECTS))
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(_OBJECTS))

到目前为止还不错吧?但是……

这批货列出了我想要制裁剪品的确切方式,这没问题。我可以根据列表的内容制作 objdir 及其子文件夹,并且我可以提供此列表作为最终可执行文件的依赖项。如果这些物体真的在那里,我会没事的!

我遇到的问题是我似乎无法想出一条规则(进入 common.mk)从远程 .c 生成本地 .o!我尝试了第二次扩展以尝试制定一条规则,该规则在 .c 文件列表中搜索与所需的 .o 相对应的文件,但由于缺少多个通配符而无法使其正常工作过滤...

.SECOND_EXPANSION:
$(OBJDIR)/%.o: $$(filter %$$(addsuffix .c,$$(subst .o,,$$(notdir $$@))),$$(SOURCES_C))
$(CC) -o $@ $< $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(WARNINGS) $(DEPGENFLAGS)

我真的在这件事上扯了我的头发……有没有人管理过类似的东西?如果一切都失败了,我将把它们构建为静态库(已经像我想要的那样在项目文件夹的子目录中构建了库)但是因为这会创建额外的 makefile 来维护我真的很想避免它。

非常感谢任何帮助!

谢谢,

奥利

最佳答案

我一直在为你的问题绞尽脑汁,最后决定似乎不可能用一个 .o:.c 做你想做的事。模式规则。每个 目录都必须依赖一个模式规则。

我的建议是在每个 sources.mk 中定义一个模式规则将使用 main 提供的两个变量的文件 Makefile :

TOPDIR = ../..
OBJDIR = objdir

将模式规则定义到 sources.mk 中文件如下:

$(OBJDIR)/$(THIS_TOP)/*.o: $(TOPDIR)/$(THIS_TOP)/*.c
$(CC) -o $@ $< $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(WARNINGS) $(DEPGENFLAGS)

关于Makefiles,从另一个带有 obj 文件的文件夹构建源代码到当前的子文件夹中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8092573/

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