我有一个像这样设计的目录:
生成文件
的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。
答案 0 :(得分:2)
您必须告诉编译器将输出文件放在何处。如果您没有指定,那么它们将被放入当前目录。
因此,请更改规则以添加-o
标记:
.c.o:
gcc -c -o $@ $(CFLG) $<
.cpp.o:
g++ -c -o $@ $(CFLG) $<