我在这个网站上寻找解决方案,现在也尝试了一段时间的谷歌,但不知何故我无法让它工作。
我的源文件应该在 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)/$@
$(CC) -c $(SRCDIR)/$< -o $(OBJDIR)/$@
变体 1a:
%.o: %.cpp
$(CC) -S $(SRCDIR)/$< -o $(OBJDIR)/$@
$(CC) -c $(SRCDIR)/$< -o $(OBJDIR)/$@
当我使用这种模式时,我总是得到一个错误,即 nohupshd.o 没有规则来构建。
变体 2:
$(OBJ) : $(OBJDIR)/%.o: $(SRCDIR)/%.cpp
$(CC) -S $(SRCDIR)/$< -o $(OBJDIR)/$@
$(CC) -c $(SRCDIR)/$< -o $(OBJDIR)/$@
当我使用这个变体时,我可以看到它试图构建,但是我收到错误消息,说“file”.o 不符合目标模式。
另一个问题是“$<”没有给我源名称。根据几个站点应该,但我可以在输出中看到什么都没有,那么我该如何解决这个问题?
更新:
与此同时,我的最新版本如下所示:
$(OBJDIR)/$(OBJ) : $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
$(CC) -S $< -o $(OBJDIR)/`basename $@ .o`.asm
$(CC) -c $< -o $@
这现在设法编译第一个对象文件(nohupshd.o),但是当 make 尝试执行第二个文件时,它再次失败说:目标“task.o”与模式不匹配。