【问题标题】:Makefile - link input file from folderMakefile - 从文件夹链接输入文件
【发布时间】:2017-02-14 09:04:28
【问题描述】:

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

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 目录中找不到对象;

有什么想法吗?

谢谢

【问题讨论】:

  • 是的,这听起来很有趣,但就我而言,我需要从项目源和外部库创建对象。所以我不确定让这个语法能够链接两个对象..

标签: makefile


【解决方案1】:

您的 myApp 配方使用 $+,其中列出了先决条件。它在obj1.o obj2.o 中扩展。但是你在$(OBJ_PATH) 中构建了obj1.o 和obj2.o。因此链接器尝试在根目录中查找对象,但找不到它们,因为它们在$(OBJ_PATH) 中。 由于您的食谱明确列出了它们(使用$(OBJS)),因此您不需要自动变量。

旁注

根据 Paul 的 Makefiles 的第二条规则,最好每条规则都更新一个与目标名称完全对应的文件(包括路径部分)(换句话说,在配方中始终使用$@),以便总是知道哪个是更新的确切文件。 在您的情况下,如果您想在 OBJ_PATH 中构建对象文件,您可以为每个使用 $(OBJ_PATH)/obj.o 形式的规则。 您还可以用$(OBJS) 替换myApp 的依赖项,并使用自动变量(顺便说一句,您是否有理由更喜欢$+ 而不是$^(做同样的事情,但不要在先决条件列表中保留重复项) ?)。

【讨论】:

  • 嗨 VannTen,我修改为 $(OBJ_PATH)/obj1.o: $(SRC)/Manager.cpp ...对于 myApp,$(EXEC) cp $@ $(OBJ_PATH)/ $(TRGT_ARCH) 变成 $(EXEC) cp $@ $(TRGT_ARCH)/.. 谢谢你的解释:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
相关资源
最近更新 更多