c - Makefile 顺序,并不编译所有内容

标签 c makefile

我有一个包含这个简单规则的 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/

相关文章:

c++ - C语言的油漆桶

linux - 如何将目标词干传递给 Makefile 中的 shell 命令

c++ - 生成文件 'fdopen: Bad file descriptor' 错误

c - 使用 sigaction() 进行 I/O 处理

c - 通过链接描述文件插入库函数 : other functions cause segfault

c - 在 Web 服务器端使用用 C 编写的 CGI 脚本的缺点?

ios - 无法为 iOS 编译 LAME

可以让 "target"带参数吗?

c++ - 海湾合作委员会 : Specifying static/dynamic libraries to build against

c++ - 这段代码是如何工作的?