我尝试使用存储在子目录中的生成对象编译项目:
myproject:
|
src: .cpp, .cpp ...
|
release: .o, .o ...
这是Makefile的一部分:
SRC ?= src
OBJ_PATH = $(SRC)/Release
vpath %.o $(OBJ_PATH)
...
OBJS := $(addprefix $(OBJ_PATH)/,obj1.o obj2.o )
all: build
obj1.o: $(SRC)/Manager.cpp
$(EXEC) $(CC) $(INCLUDES) $(CCFLAGS) $(GNCD_FLGS) -c $(<) -o $(OBJ_PATH)/$@ #-o $@ -c $<
obj2.o: $(SRC)/Synth.cpp
$(EXEC) $(CC) $(INCLUDES) $(CCFLAGS) $(GNCD_FLGS) $(DEFS) -c $(<) -o $(OBJ_PATH)/$@ #-o $@ -c $<
myApp: obj1.o obj2.o
$(EXEC) $(CC) $(LDFLAGS) $(GNCD_FLGS) -o $@ $(OBJS) $+ $(LIBS)
$(EXEC) mkdir -p $(OBJ_PATH)/$(TRGT_ARCH)/$(TRGT_OS)/$(BLD_TP)
$(EXEC) cp $@ $(OBJ_PATH)/$(TRGT_ARCH)/$(TRGT_OS)/$(BLD_TP)
$(OBJECTS) : Stt.h
build: myApp
run: build
$(EXEC) ./myApp
..但我收到了错误链接:
Could not open input file 'obj1.o'
Makefile:86: recipe for target 'myApp' failed
所以似乎无法在src / Release目录中找到对象;
任何想法?
感谢&#39; S
答案 0 :(得分:0)
myApp的配方使用$+
,列出了先决条件。它在obj1.o obj2.o
中扩展。但是你在$(OBJ_PATH)
中构建了obj1.o和obj2.o。因此,链接器尝试在根目录中查找对象,但无法找到它们,因为它们位于$(OBJ_PATH)
中。
由于您的食谱明确列出了它们(使用$(OBJS)
),因此您不需要自动变量。
<强>旁注强>
根据Paul的第二条Makefiles规则,每条规则最好更新一个与目标名称完全对应的文件(包括路径部分)(换句话说,始终使用$@
食谱),以便始终知道哪个是更新的确切文件。
在您的情况下,如果要在OBJ_PATH中构建对象文件,则可以为每个文件使用$(OBJ_PATH)/obj.o
形式的规则。
你也可以用$(OBJS)
替换myApp的依赖关系,并使用自动变量(顺便说一下,有没有理由你更喜欢$+
而不是$^
(做同样的事情但不保护先决条件清单中的重复项))。)。