gpt4 book ai didi

c - 依赖树中的 Makefile 循环

转载 作者:行者123 更新时间:2023-11-30 17:11:17 27 4
gpt4 key购买 nike

我正在尝试使用 makefile 和 nmake 在 Windows 上构建我的 C 项目。

我收到以下错误:
NMAKE: fatal error U1071:目标“src\source.c”的依赖树中的循环
停止。

完整的 makefile 是这个

CC = cl
LINK = link
CFLAGS = /Ox \
/I ext\MulticoreBSP-for-C\ \
/I ext\unistd\include \
/I ext\pthreads-win32\sources\pthreads-w32-2-9-1-release \
/D HAVE_STRUCT_TIMESPEC

SOURCE_DIR = src
OBJECT_DIR = build

LIBS = ext\pthreads-win32\sources\pthreads-w32-2-9-1-release\pthreadVC2.lib

DLLS = bin\pthreadVC2.dll
DLLS_SRC = ext\pthreads-win32\sources\pthreads-w32-2-9-1-release\pthreadVC2.dll

BSP_SOURCES = ext\MulticoreBSP-for-C\mcbsp.c ext\MulticoreBSP-for-C\mcinternal.c ext\MulticoreBSP-for-C\mcutil.c
USER_SOURCES = source.c

SOURCES = src\$(USER_SOURCES) $(BSP_SOURCES)
OBJECTS = $(SOURCES:*.c=build\*.obj)
# OBJECTS = build\source.obj build\mcbsp.obj build\mcinternal.obj build\mcutil.obj
EXECUTABLE = bin\BSP.exe

all: $(EXECUTABLE) $(DLLS) $(OBJECTS)

$(EXECUTABLE): $(OBJECTS)
$(LINK) $(OBJECTS) $(LIBS) /OUT:$(EXECUTABLE)

$(DLLS): $(DLLS_SRC)
copy $** $@

$(OBJECTS): $(SOURCES)
$(CC) $(LDFLAGS) /c /Fo.\$(OBJECT_DIR)\ $@ $** $(CFLAGS)

clean:
del $(OBJECT_DIR)\*.obj bin\*.dll bin\*.exe

我可以看到问题来自于将第 21 行中的 OBJECTS 定义为OBJECTS = $(SOURCES:*.c=build\*.obj) 然后使用规则 $(OBJECTS): $(SOURCES)。这是循环的事实是相当清楚的,并且使用第 22 行中带注释的 OBJECTS 定义效果很好。

如何实现 OBJECTS 的自动定义,而不会使第 33 行的规则造成麻烦?我需要不同的规则,还是其他什么?

(我有单独的文件夹来存放源文件和对象,我认为这会阻止我使用像 .c.obj: 这样的简单规则。至少,我没有它可以使用这种形式的东西来工作)。

谢谢。

最佳答案

虽然 nmake 支持模式匹配语法 $(macroname:string1=string2),但不支持以这种方式使用通配符。如果我找到一种在 nmake 版本的字符串替换中使用通配符的方法,我将编辑此答案。

编辑:

这有点狡猾,但以下解决了问题

BSP_SOURCES = mcbsp.c mcinternal.c mcutil.c
USER_SOURCES = source.c

SOURCES = src\$(USER_SOURCES) ext\MulticoreBSP-for-C\$(BSP_SOURCES: = ext\MulticoreBSP-for-C\)
_OBJECTS = build\$(USER_SOURCES) build\$(BSP_SOURCES: = build\)
OBJECTS = $(_OBJECTS:.c=.obj)

基本上,模式匹配源列表中元素之间的空格,而不是使用通配符。请注意,第一个前缀添加在模式匹配之外,因为列表开头没有空格。另请注意,替换必须分两步完成。

不优雅但有效。

关于c - 依赖树中的 Makefile 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32394965/

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