我试图使用makefile和nmake在windows上构建我的c项目。
我得到以下错误:NMAKE : fatal error U1071: cycle in dependency tree for target 'src\source.c' Stop.
完整的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的注释定义很好。
在没有第33行规则的情况下,如何实现OBJECTS的自动定义?我需要一条不同的规则还是别的什么?
(我为源文件和对象提供了单独的文件夹,我认为这样可以阻止我使用像.c.obj:这样的简单规则。至少,我还没有让它使用那种形式的东西)。
谢谢。
发布于 2015-09-04 11:35:36
虽然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)基本上,模式匹配源列表中元素之间的空格,而不是使用通配符。注意,第一个前缀是在模式匹配之外添加的,因为列表开头没有空格。还请注意,替换必须分两个步骤进行。
不雅但有效。
https://stackoverflow.com/questions/32394965
复制相似问题