首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖树中的Makefile循环

依赖树中的Makefile循环
EN

Stack Overflow用户
提问于 2015-09-04 09:47:56
回答 1查看 1.5K关注 0票数 0

我试图使用makefile和nmake在windows上构建我的c项目。

我得到以下错误:NMAKE : fatal error U1071: cycle in dependency tree for target 'src\source.c' Stop.

完整的makefile是

代码语言:javascript
复制
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的注释定义很好。

在没有第33行规则的情况下,如何实现OBJECTS的自动定义?我需要一条不同的规则还是别的什么?

(我为源文件和对象提供了单独的文件夹,我认为这样可以阻止我使用像.c.obj:这样的简单规则。至少,我还没有让它使用那种形式的东西)。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-04 11:35:36

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

编辑:

这有点不靠谱,但下面的方法解决了这个问题

代码语言:javascript
复制
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)

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

不雅但有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32394965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档