我的项目中有多个文件,使用-fPIC
或没有此选项编译为目标文件。编译这些文件以供在共享库中使用时,此选项是必需的,否则不是。因此,当我将项目编译到共享库中时,此选项是必需的
然而,我永远不确定最后的编译是否在共享库中完成。如果没有,我想将它编译到共享库中,编译失败,我必须删除生成的目标文件。重新编译这些目标文件需要花费很多时间,我想避免这种情况
makefile是否有一种方法可以检测目标文件是否在开头使用或不使用此选项进行编译,以便编译可以继续,或者两者都必须重新编译,而不会产生错误或花费很多在不必要的重新编译循环中的时间?
答案 0 :(得分:2)
问:“有没有办法让makefile检测是否使用此选项编译了目标文件”
简答:否
答案很长:如果源文件可以使用不同的选项构建,并且您必须同时访问不同的版本,那么您必须拥有多个输出文件夹。 makefile必须在正确的文件夹中生成它们。 对于简单的调试/发布(“-g”标志)说这样的事情:
|
-src
-include
-BUILD
|
-obj
| -debug
| -release
-bin
|-debug
|-release
当然,这种方法有局限性。例如,如果您需要同时具有“debug / release”和“PIC / not PIC”,那么您将需要4个输出文件夹。
您也可以将我的方法与@BasileStarynkevitch提出的方法混合使用(生成特定名称)。
答案 1 :(得分:1)
一种可能的方法是拥有关于目标文件及其命名的自己的约定。例如,文件foo.c
在与位置无关的代码时会被编译到foo.pic.o
,而在不在时会被编译到foo.o
。您可以将该想法适用于其他情况(例如,foo.dbg.o
用于具有DWARF调试信息的文件,使用-g
编译。您也可以使用子目录,例如将foo.c
编译为PICOBJ/foo.o
或PICOBJ/foo.pic.o
以获取PIC对象文件,但make
(beware of recursive makes)可能不太方便。
为Makefile
编写适当的规则非常简单。
请注意其他build automation系统,例如ninja