我有一个包含这个简单规则的 makefile,
ref_approx_bs2_rsq_5_10_1ulp_arch1 : ref_approx_bs2_rsq_5_10_1ulp_arch1.o
gcc -I../CModels -L../CModels -std=c99 -o ref_approx_bs2_rsq_5_10_1ulp_arch1 ref_approx_bs2_rsq_5_10_1ulp_arch1.o -lm -limg_float
ref_approx_bs2_rsq_5_10_1ulp_arch1.o : ref_approx_rsq.c ../CModels/cogen_fp_bs2_rsq_5_10_1ulp_arch1.cpp ../CModels/cogen_fp_bs2_rsq_5_10_1ulp_arch1.h ../CModels/img_float.h ../CModels/img_float.c
gcc -DCMODELLOC=\"../CModels/cogen_fp_bs2_rsq_5_10_1ulp_arch1.cpp\" -DCMODEL_NAME=cogen_fp_bs2_rsq_5_10_1ulp_arch1 -std=c99 -o ref_approx_bs2_rsq_5_10_1ulp_arch1.o -c ref_approx_rsq.c
libimg_float.a : ../CModels/img_float.o
ar -rcs ../CModels/libimg_float.a ../CModels/img_float.o
img_float.o : ../CModels/img_float.h ../CModels/img_float.c
gcc -I ../CModels/ -o ../CModels/img_float.o -c ../CModels/img_float.c
但基本上,如果我修改 img_float.c 并尝试再次使用 make 文件,它不会编译并创建 libimg_float.a。
makefile 本身对我来说看起来是正确的,因为我已经编写了所有先决条件。
有什么建议吗?
最佳答案
它不会重新编译 libimg_float.a
,因为没有任何东西依赖于它。
Make 不会遍历你的 makefile,并且总是尝试重建每个目标。通过找到列出的第一个(显式)目标并尝试构建它来实现工作。在构建第一个目标之前,它将尝试构建该目标的所有先决条件,在此之前它将尝试构建那些目标的所有先决条件,依此类推,直到找不到更多先决条件。
如果有一个目标不是第一个目标的先决条件(或其先决条件等),则默认情况下不会构建它。您可以通过在命令行上列出来请求构建它:make libimg_float.a
将告诉 make 构建该目标,而不是第一个显式目标。当然,您可以在命令行上列出很多目标。
但通常人们首先创建一个目标,通常称为 all
,它列出了作为先决条件默认应构建的所有目标。
但是,您的 makefile 不正确,因为您的 ref_approx_bs2_rsq_5_10_1ulp_arch1
目标确实使用了 libimg_float.a
,但它并未列为先决条件。这意味着当 libimg_float.a
过期时它不会更新。您应该更改 makefile 以显示先决条件关系:
ref_approx_bs2_rsq_5_10_1ulp_arch1 : ref_approx_bs2_rsq_5_10_1ulp_arch1.o libimg_float.a
关于c - Makefile 顺序,并不编译所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30864551/