Makfile order-only prerequisites 应用场景,解决并行编译遇到的object存放的自定子目录未被提前创建导致编译失败的问题,No target rule

Posted sean-zhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makfile order-only prerequisites 应用场景,解决并行编译遇到的object存放的自定子目录未被提前创建导致编译失败的问题,No target rule相关的知识,希望对你有一定的参考价值。

1 normal prerequisites和order-only prerequisites的区别

https://blog.csdn.net/wwwlyj123321/article/details/107634687

2 场景参考

在工程中使用makefile将所有的object文件,存放一个集中的目录中,而不是放置在与source同目录的情况下。这样带来的好处是,源码目录中不存在中间object文件,方便代码管理。

由于不同的子目录可能存在同名的源文件,因此不建议将所有的object放在同级的目录下面,会导致原来不同的文件会被覆盖。

可以考虑这样的方式:

源码目录

└── a
├── b
│ └── c
└── d

顶层目录存在makefile,执行makefile时,顶层目录创建objs。整个文件目录结构将会变成下面这样,这样对应a/b目录下的某xx.cpp,将会链接到objs/a/b/xx.o。创造一种镜像文件目录结构的方式。

├── a
│ ├── b
│ │ └── c
│ └── d
└── objs
└── a
├── b
│ └── c
└── d

因此,在makefile中,编译所有的object时,前提是创建好objs目录结构。可以采用foreach函数逐次mkdir -p的方式。所有的目录采用wildcard 和 patsubst的方式,简历镜像目录

2.1 非并行编译

很简单,一般放置在objs被编译之前的目标位置就ok。

2.2 并行编译

并行编译时,目录创建的目标的操作,由于并行执行的关系,可能有时会被放在gcc -o object之后,导致目标目录不存在,导致makefile执行失败。

此时,必须将mkdir的操作防止在obj的依赖。

normal prerequiresite的方式带来的问题时,每次重新编译时对应的objs目录下文件会被更新。让makefile以为文件更新,需要重建目标。

order-only 的方式,就会避免此问题。

以上是关于Makfile order-only prerequisites 应用场景,解决并行编译遇到的object存放的自定子目录未被提前创建导致编译失败的问题,No target rule的主要内容,如果未能解决你的问题,请参考以下文章

Makfile order-only prerequisites 应用场景,解决并行编译遇到的object存放的自定子目录未被提前创建导致编译失败的问题,No target rule

Makfile——基础知识

Makfile——基础知识

Makfile 和 SDL 遇到问题

makfile

Gdb调试工具/ Makfile项目管理