Makefile,子目录中的一些源代码

时间:2015-01-19 22:29:47

标签: gcc makefile

我有一个像这样设计的目录:

  

生成文件

     

的main.cpp

     
    

header.h

         

src1.c

         

src2.c

  

这是(大部分)我的makefile:

SRC = subdir

# Main Dependencies
main.o: main.c $(SRC)/header.h

# Source Dependencies
$(SRC)/src1.o: $(SRC)/src1.c $(SRC)/header.h
$(SRC)/src2.o: $(SRC)/src2.c $(SRC)/header.h

#  Create archive from sources
$(SRC)/archive.a: $(SRC)/src1.o $(SRC)/src2.o
    ar -rcs $@ $^

# Compile rules
.c.o:
    gcc -c $(CFLG) $<
.cpp.o:
    g++ -c $(CFLG) $<

#  Link main with archive
main: main.o $(SRC)/archive.a
    gcc -O3 -o $@ $^   $(LIBS)

当我运行它时,.o文件都是在root而不是subdir中创建的。然后在进行archive.a时崩溃,因为.o文件不在预期的位置:“ar:subdir / src1.o:没有这样的文件或目录”

我尝试从.o文件中删除$(SRC)/,因为那不是它们实际创建的地方,但是在尝试编译src1.c时它会崩溃。

我需要做些什么来完成这项工作?我确定我犯了一些愚蠢的错误,但我对makefile并不是很熟悉。 :/

我希望.o文件出现在一个子目录中,但是如果它们出现在root中也可以,只要它编译。<​​/ p>

我在Ubuntu 14.04上,使用gcc 4.8.2。

1 个答案:

答案 0 :(得分:2)

您必须告诉编译器将输出文件放在何处。如果您没有指定,那么它们将被放入当前目录。

因此,请更改规则以添加-o标记:

.c.o:
        gcc -c -o $@ $(CFLG) $<
.cpp.o:
        g++ -c -o $@ $(CFLG) $<