我在想......
当您对file1.c
或file2.c
或file1.h
进行更改时,以下makefile仅重新编译所需内容(这很好)
# Link to executable
result: file1.o file2.o
gcc file1.o file2.o -o result23
# Assemble to .o object files
file1.o: file1.s
gcc -c dist/file1.s
file2.o: file2.s
gcc -c dist/file2.s
# Compile to .s assembly files
file1.s: file1.c
gcc -S file1.c
file2.s: file2.c
gcc -S file2.c
但是,当我将构建的对象移动到另一个目录时,无论是否只更改了1个文件的内容,所有内容都会一直重建。
# Link to executable
result: file1.o file2.o
gcc file1.o file2.o -o result23
# Assemble to .o object files
file1.o: file1.s
gcc -c dist/file1.s
mv file1.o dist
file2.o: file2.s
gcc -c dist/file2.s
mv file2.o dist
# Compile to .s assembly files
file1.s: file1.c
gcc -S file1.c
mv file1.s dist
file2.s: file2.c
gcc -S file2.c
mv file2.s dist
似乎发生了这种情况,因为make
不知道.o
文件在其环境中的位置。
有几个问题:
答案 0 :(得分:5)
要修复您的构建,您需要执行以下操作:
# Link to executable
result: dist/file1.o dist/file2.o
gcc dist/file1.o dist/file2.o -o result
# Assemble to .o object files in main directory
dist/file1.o: dist/file1.s
gcc -c dist/file1.s -o dist/file1.o
dist/file2.o: dist/file2.s
gcc -c dist/file2.s -o dist/file2.o
# Compile to .s assembly files
dist/file1.s: file1.c
gcc -S file1.c -o dist/file1.s
dist/file2.s: file2.c
gcc -S file2.c -o dist/file2.s
你当然可以在make中使用环境变量..虽然我不确定这与你的问题的核心有什么关系:只需使用这样的东西,设置BUILDDIR和OBJDIR并有一个像这样的makefile:
$(BUILDDIR)/foo : $(OBJDIR)/bar.o
g++ $(OBJDIR)/bar.o -o $(BUILDDIR)/foo
虽然你可以使用automatic variables来改善这个(以及我的固定makefile):
$(BUILDDIR)/foo : $(OBJDIR)/bar.o
g++ $? -o $@
答案 1 :(得分:1)
1,您可以像任何其他变量一样访问您的环境变量;例如,$(TERM)
2,只需更改您的make目标以包含目标目录:
dist/file1.o: file1.s
gcc -c dist/file1.s -o $@
其中$@
是表示目标的隐式变量,在此示例中为dist/file1.o
。