[英]Makefile cycle in dependency tree
我正在嘗試使用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
我可以看到,這個問題來自定義OBJECTS
在線路21 OBJECTS = $(SOURCES:*.c=build\\*.obj)
然后有規則$(OBJECTS): $(SOURCES)
這是循環的事實非常清楚,在第22行中使用注釋的OBJECTS
定義可以很好地工作。
在第33行的規則不會引起麻煩的情況下,如何實現OBJECTS
的自動定義? 我是否需要其他規則?
(我為源文件和對象提供了單獨的文件夾,並且我認為這樣做.c.obj:
我無法使用.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)
基本上,模式匹配源列表中元素之間的空格,而不是使用通配符。 請注意,第一個前綴被添加到模式匹配之外,因為列表的開頭沒有空格。 還要注意,替換必須分兩步完成。
不雅但有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.