Makefile文件 - 从文件夹
链接输入文件我尝试编译存储在一个子目录下生成对象的一个项目: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)/[email protected] #-o [email protected] -c $<
obj2.o: $(SRC)/Synth.cpp
$(EXEC) $(CC) $(INCLUDES) $(CCFLAGS) $(GNCD_FLGS) $(DEFS) -c $(<) -o $(OBJ_PATH)/[email protected] #-o [email protected] -c $<
myApp: obj1.o obj2.o
$(EXEC) $(CC) $(LDFLAGS) $(GNCD_FLGS) -o [email protected] $(OBJS) $+ $(LIBS)
$(EXEC) mkdir -p $(OBJ_PATH)/$(TRGT_ARCH)/$(TRGT_OS)/$(BLD_TP)
$(EXEC) cp [email protected] $(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 dir中找不到对象;
有什么想法?
感谢的
您的对myApp配方使用$+
,其中列出的先决条件。它扩大obj1.o obj2.o
。但是你在$(OBJ_PATH)
中构建obj1.o和obj2.o。所以链接器试图找到根目录中的对象,但找不到它们,因为它们在$(OBJ_PATH)
中。 因为你的食谱明确地列出了他们(与$(OBJS)
),你不需要自动变量。
旁注
根据保罗的第二次Makefile中的规则,它是最好的,每一个规则更新完全对应的目标名称(包括路径部分)的文件(换句话说,总是在使用[email protected]
配方),以便始终知道哪些是更新的确切文件。 在你的情况,如果你想建立在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)/ ..谢谢对您的解释:) – spin0
这是http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory-than-src的副本? –
是的,这听起来很有趣,但在我的情况下,我需要从项目源和外部库创建对象。所以,我不知道得到这个语法能够既对象链接.. – spin0