簡體   English   中英

依賴樹中的Makefile循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM