仅在项目发生更改时添加编译时间戳 (C)

Posted

技术标签:

【中文标题】仅在项目发生更改时添加编译时间戳 (C)【英文标题】:Adding a compilation time stamp ONLY when changes occurred in the project (C) 【发布时间】:2012-06-14 19:25:49 【问题描述】:

我目前正在创建一个新的 C 项目,我遇到了需要用一些数据(包括时间和日期)标记每个编译。

标准且简单的方法是:

    通过一个简单的脚本生成一个 .c 文件,添加所需的信息。使用此解决方案,项目将始终生成新的工件(例如 .o),即使项目本身未发生任何更改(未更改任何文件)。

    已经准备好一个 .c 文件,如果需要的话,包含 timedate 和其他东西,只有在清理项目后才编译它。更改项目中的源文件或头文件不会导致标记被更改(除非我们先清理项目)。

我正在寻找的是介于两者之间的东西: 当项目文件发生变化时,请确保添加编译标记。

【问题讨论】:

【参考方案1】:

我不确定eclipse,但是如果你使用make和makefiles,你可以使用下面例子中的想法(在cygwin环境下工作)。

make 执行链接命令(最后一个)时,它也会编译嵌入时间的文件。当可执行文件是最新的时,不会调用链接,因此不会更改时间戳。为了使它起作用,您不应告知make 带有时间戳的文件是任何事情的先决条件。

# Makefile
a.exe: a.o # note: doesn't depend on mytime.c
    gcc a.o mytime.c -o a.exe # note: cannot use ld, must link with gcc

a.o: a.c
    gcc -c a.c

// mytime.c
char* mytime = __TIME__;

// a.c
#include <stdio.h>
extern char* mytime;
int main()

    printf("%s\n", mytime);

【讨论】:

【参考方案2】:

您也可以使用 git hook 在运行 git commitgit pull 时创建(未版本化的)时间戳 .c 文件。

【讨论】:

这是一个好主意,虽然它依赖于 VCS(并非所有工具都支持这种钩子),但它看起来非常适合将它与我的琐碎选项 (2) 结合使用。钩子只会触及标记文件,因此下次将被编译。 +1 为您指明方向。 Anatoly 技巧有点通用,不依赖于 VCS,所以我会接受它。非常感谢!

以上是关于仅在项目发生更改时添加编译时间戳 (C)的主要内容,如果未能解决你的问题,请参考以下文章

编译器错误 - 仅在从命令行编译时

Angular:防止资产文件夹发生更改时自动重新编译

Java“常量字符串太长”编译错误。仅在使用 Ant 时发生,在使用 Eclipse 时不会发生

--add-modules 仅在编译时[重复]

用于在头文件更改时构建简单 c 项目重新编译的示例 makefile

使用maven编译scala项目时栈溢出