【问题标题】:Check if files were compiled with certain flags in Makefile检查文件是否使用 Makefile 中的某些标志编译
【发布时间】:2018-01-08 12:24:39
【问题描述】:

我的项目中有多个文件使用-fPIC 或不使用此选项编译为目标文件。当编译这些文件以在共享库中使用时,此选项是必需的,否则不是。因此,当我将项目编译为共享库时,此选项是必需的。
尽管如此,我永远不确定最后一次编译是否已在共享库中完成。如果没有,我想把它编译到共享库中,编译失败,我必须删除生成的目标文件。重新编译这些目标文件需要很长时间,我想避免这种情况。
有没有办法让makefile在开始时检测目标文件是否在开始时使用或不使用此选项进行编译,以便编译可以继续,或者两者都必须重新编译,而不会产生错误或花费很多不必要的重新编译循环中的时间?

【问题讨论】:

  • @KarstenKoop:我怎样才能包含 f.ex。我的 makefile 中的第一个答案?
  • 是什么导致-fPIC 在构建之间出现/消失?通常这将是您在 Makefile 本身中更改的内容,从而触发完全重建。
  • 我通常用来区分使用某些选项构建的文件的方法是使构建输出文件夹的名称取决于这些选项。例如build_fPICbuild_no_fPIC
  • 对于发布与调试构建等类似。

标签: c++ c makefile


【解决方案1】:

问:“makefile 有没有办法检测目标文件是否已在使用或不使用此选项的情况下进行编译”

简短回答:否

长答案:如果源文件可以使用不同的选项构建,并且您必须同时访问不同的构建,那么您必须有多个输出文件夹。并且 makefile 必须在正确的文件夹中生成它们。 为简单的调试/发布(“-g”标志)说这样的话:

|
-src
-include
-BUILD
  |
  -obj
  | -debug
  | -release
  -bin
    |-debug
    |-release

当然,这种方法有局限性。例如,如果您需要同时拥有“debug/release”和“PIC/not PIC”,那么您将需要 4 个输出文件夹。

您还可以将我的方法与@BasileStarynkevitch 提出的方法混合使用(生成特定名称)。

【讨论】:

    【解决方案2】:

    一种可能的方法是对目标文件及其命名有自己的约定。例如,文件foo.c 是位置无关代码时将编译为foo.pic.o,而不是位置无关代码时编译为foo.o。您可以将这个想法应用于其他情况(例如,foo.dbg.o 用于带有 DWARF 调试信息的文件,使用 -g 编译)。您还可以使用子目录,例如将foo.c 编译为PICOBJ/foo.oPICOBJ/foo.pic.o 以获得PIC 目标文件,但使用make (beware of recursive makes) 可能不太方便。

    为您的Makefile 编写适当的规则非常容易。

    注意其他build automation 系统,例如ninja.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多