我想在Windows上使用makefile和nmake構建我的c項目。Makefile循環依賴樹
我收到以下錯誤: 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 $** [email protected]
$(OBJECTS): $(SOURCES)
$(CC) $(LDFLAGS) /c /Fo.\$(OBJECT_DIR)\ [email protected] $** $(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:
。至少,我沒有得到它的工作使用這種形式的東西)。
謝謝。
您是否嘗試過打印'SOURCES'和'OBJECTS',以確保它們正確? –
此外,現在*所有*目標文件取決於*所有*源文件。因此,修改單個源文件將導致重新編譯所有源文件。 –
謝謝Joachim。在回顯「OBJECTS」變量後,似乎strsub不起作用,而「OBJECTS」變量與「SOURCES」相同。除非你知道爲什麼它不起作用,否則我必須研究這一點。 – Sam