【发布时间】:2013-04-11 15:45:33
【问题描述】:
我一直在这个网站上寻找解决方案,并且现在也尝试了谷歌一段时间,但不知何故我无法让它工作。
我的源文件应该在 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)/$@
当我使用此变体时,我可以看到它尝试构建,但我收到错误消息,提示“文件”.o 不符合目标模式。
另一个问题是“$
更新:
与此同时,我的最新版本如下所示:
$(OBJDIR)/$(OBJ) : $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
$(CC) -S $< -o $(OBJDIR)/`basename $@ .o`.asm
$(CC) -c $< -o $@
现在可以编译第一个对象文件 (nohupshd.o),但是当 make 尝试编译第二个文件时,它再次失败,提示:目标 'task.o' 与模式不匹配。
【问题讨论】:
-
至少现在我理解了真正问题的一部分。目标文件位于 obj 目录中。当我将其作为依赖项 $(OBJDIR)/$(OBJ) 时,它会扩展为 obj/o1.o o2.o ... 而它应该是 obj/o1.o obj/o2.o ...,那么我真的必须在每个单独的文件上指定 obj 路径吗?