【问题标题】:Compilation script编译脚本
【发布时间】:2012-01-31 06:57:57
【问题描述】:

我想知道一种编译使用许多文件的程序的好方法,并且我想避免重新编译未修改的文件。

它适用于 Linux,我正在寻找与 Makefile 不同的东西。

Makefile 有一些问题:
写起来很长,只要我创建新文件就改变它很冗长; C/C++ 使用头文件。
如果 Makefile 包含的 .h 文件包含另一个已修改的 .h 文件,则它不会重新编译 .c 文件。它需要复杂的语法。
Makefile 使用制表符,不好,因为我使用 tab 键缩进(它插入 4 个空格字符)。

举个例子,我原来的编译脚本是:

gcc file1.c -c -flags1
gcc file2.c -c -flags2
gcc file3.c file4.c -c -flags3
gcc file1.o file2.o file3.o file4.o -o a.out

我想避免用简单的方法重新编译不需要的东西。

【问题讨论】:

  • 人们不得不想知道每个 .c 文件的不同标志是怎么回事。
  • 请注意,您的四个空格问题是您的编辑器(或编辑器设置)的缺陷,而不是 make 本身。任何不能让你插入任意字符的编辑器都是脑残。
  • 关于 makefile 中的选项卡,如果您想要其他内容,可以使用 .RECIPEPREFIX
  • 我不明白你为什么不喜欢使用建筑软件的想法(比如make 或其他东西)。而且你总是可以将你的编译命令放在一个 shell 脚本中(但我建议使用omakemake)。见我的回复stackoverflow.com/a/8692140/841108
  • 我将编辑器配置为使用空格而不是制表符。它有助于缩进。

标签: c linux compilation automation


【解决方案1】:

更新:这篇文章中提到的制作教程已经不存在了,这真是太可惜了,因为它是一个非常好的介绍。

Makefile 可以是无缝的,您可以让它完全基于项目目录中的文件自动编译您的项目。请参阅此Make Tutorial。在该教程之后,您将学会创建动态 Makefile 脚本,该脚本仅编译已修改的内容,并遵循依赖关系树。

但是,如果您想进一步了解一些魔法,请查看 DevKitPro 生成文件,它们甚至可以使用我只能假定的用途来找出 头文件依赖项 grep。随意为您自己的项目修改它。

【讨论】:

    【解决方案2】:

    您还可以使用其他构建器,例如omake build systemP.Millier's cook system 等。我认为omake 非常强大。使用其他构建器的缺点是make通常在每个Linux系统上都可用,但omake(或cmakecook)的情况并非如此。

    不要忘记make 依赖可以由gcc 和多个preprocessor options 生成,例如-M 等。在实践中,您可以使用GNU make 技巧来避免编写复杂的Makefile-s。

    优秀的编辑器,例如emacs 为您提供特定模式来帮助编辑(和突出显示)Makefile-s。

    您可以使用(甚至在Makefile-s 内部或与omake 或其他构建器一起使用)ccache 编译器缓存(并且可以通过将其符号链接为gcc 来“透明地”使用它)。

    您可以将您的编译分发到本地网络上的其他机器,例如distccicecream。当然,许多构建器允许并行编译(例如make -j)。

    存在多个 Makefile 生成器,特别是 GNU autotools 套件和 cmake

    不要忘记为您的源代码使用版本控制系统(如 GIT)。

    【讨论】:

    • +1:我用过 OMake,它使用起来非常简单,而且同样具有表现力。
    【解决方案3】:

    一些项目(Doom3、MongoDB 和其他)使用SCons

    它是用 Python 编写的,具有许多功能(如并行编译)。

    【讨论】:

      【解决方案4】:

      我找到了一种更简单的使用 makefile 的方法,它可以工作。没有表格。使用touch,我可以强制依赖头文件进行编译。

      myexe.out: file1.o file2.o;\
      g++ file1.o file2.o -o myexe.out
      
      file1.o: file1.cpp;\
      g++ -c file1.cpp -flags1
      
      file2.o: file2.cpp header1.hpp;\
      g++ -c file2.cpp -flags2
      
      header1.hpp: header2.hpp;\
      touch header1.hpp
      

      我会试试 SCons。
      谢谢大家。

      【讨论】:

      • 你也应该看看omake
      猜你喜欢
      • 2011-06-30
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多