我在這個網站上尋找解決方案,也嘗試谷歌一段時間了,但不知何故,我不能讓它工作。Makefile:沒有規則,使目標
我的源代碼應該在src目錄中,而目標文件應該在obj目錄中。現在我嘗試創建一個簡單的makefie,但是我得到一個沒有規則的錯誤,或者我無法使它工作來使用目錄。
CC = /usr/bin/gcc
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
SRC:= nohupshd.cpp \
task.cpp
OBJ:= nohupshd.o \
task.o
OBJDIR:= obj
SRCDIR:= src
DEP:= src/task.h
LIBS:=
TARGET:= nohupshd
all: $(TARGET)
$(TARGET): $(OBJ)
$(CC) -o $(TARGET) $(OBJ) $(LIBS)
clean:
rm -f $(OBJ) $(TARGET)
變體1:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
$(CC) -S $(SRCDIR)/$< -o $(OBJDIR)/[email protected]
$(CC) -c $(SRCDIR)/$< -o $(OBJDIR)/[email protected]
變1A:
%.o: %.cpp
$(CC) -S $(SRCDIR)/$< -o $(OBJDIR)/[email protected]
$(CC) -c $(SRCDIR)/$< -o $(OBJDIR)/[email protected]
當我使用這個模式,我總是得到一個錯誤,沒有規則nohupshd.o建設。
變2:
$(OBJ) : $(OBJDIR)/%.o: $(SRCDIR)/%.cpp
$(CC) -S $(SRCDIR)/$< -o $(OBJDIR)/[email protected]
$(CC) -c $(SRCDIR)/$< -o $(OBJDIR)/[email protected]
當我使用這個變體,我可以看到,它試圖建立,但我得到的錯誤說,「文件」的.o不適合的目標模式。
另一個問題是,「$ <」不給我源名稱。根據幾個網站它應該,但我可以看到在輸出中沒有什麼,所以我該如何解決這個問題?
更新:
在此期間我的最新版本是這樣的:
$(OBJDIR)/$(OBJ) : $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
$(CC) -S $< -o $(OBJDIR)/`basename [email protected] .o`.asm
$(CC) -c $< -o [email protected]
這現在管理編譯第一objectfile(nohupshd.o),但是當make試圖做第二個文件,它再次失敗說:target'task.o'與模式不匹配。
至少現在我明白了一部分現實問題。目標文件位於obj目錄中。當我把它作爲依賴項$(OBJDIR)/ $(OBJ)時,它會擴展爲obj/o1.o o2.o ...而它應該是obj/o1.o obj/o2.o ...,那麼,我必須在每個單獨的文件上真正指定obj路徑嗎? – Devolus