Makefile - 链接文件夹中的输入文件

时间:2017-02-14 09:04:29

标签: makefile

我尝试使用存储在子目录中的生成对象编译项目:

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

1 个答案:

答案 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的依赖关系,并使用自动变量(顺便说一下,有没有理由你更喜欢$+而不是$^(做同样的事情但不保护先决条件清单中的重复项))。)。