如何自动创建具有最新编译时间的文件并将其包含到库中?

Posted

技术标签:

【中文标题】如何自动创建具有最新编译时间的文件并将其包含到库中?【英文标题】:How to automatically create a file with the latest compile time and include it into a library? 【发布时间】:2008-11-26 12:52:35 【问题描述】:

我有一个包含大约 100 个源文件的库。如果已编译任何其他文件,我希望始终重新构建其中一个源,但我不希望每次运行 make/build 时都构建它。

基本上我希望这个文件有最后的构建日期/时间,所以任何链接到库的应用程序都可以检查最后的构建时间/日期。有没有其他方法可以做到这一点?

【问题讨论】:

我认为您使该文件的规则依赖于所有其他目标文件。如果任何其他目标文件较新,那么您的目标文件将被重新制作,因此它始终是最近创建的。 能否请您更改问题的标题以反映问题的内容? 嗨,Nathan,不确定我会给它取什么标题,有什么建议吗? 【参考方案1】:

让包含构建时间戳的目标文件依赖于所有其他目标文件:

version.o: $(OBJECTS)

【讨论】:

这基本上就是我想要的。现在我要做的就是弄清楚如何在 Visual Studio 2005 项目中设置依赖项。【参考方案2】:

稍微扩展一下 JesperE 的解决方案。

让目标文件依赖于可执行文件所依赖的所有目标,(不包括它自己)。

所以如果所有可执行文件都依赖于对象,那么 JesperE 是完全正确的。

否则,您可以在不更新时间戳的情况下重建可执行文件,以防其他依赖项之一发生更改但您的目标文件都没有更改。因此,问题中提到的两件事,“有最后的构建时间/日期”和“如果任何源代码已经编译则重新构建”,实际上并不是一回事,所以这取决于你想要的。

示例可能包括您静态链接的库,或者一些用于执行链接并且更改很多的脚本,因此为了方便开发人员,已将其作为依赖项。

如果您只是删除可执行文件并重新构建它,这仍然不会更新时间戳(可能是因为某些相关的内容发生了更改,但不是依赖项,例如因为您获取了最新版本的链接器或您'已经改变了影响链接器和/或makefile的环境中的某些东西)。所以最好的办法可能是将对象编译为构建可执行文件的规则的一部分,如下所示:

blah.exe : whatever
    rm -f version.o
    $(CC) $(CFLAGS) -c version.c
    $(CC) $(CFLAGS) $(OBJFILES) version.o -o blah.exe

或其他(如果您使用 make,可能不是 .exe,但您永远不知道)。实际上错误处理有点狡猾,因为如果最后一行失败,version.o 不会被删除。

我还要补充一点,如果你要向用户发布一些东西(我的意思是基本上任何距离你办公桌 10 英尺以上的人),无论如何从头开始构建而不是只运行 make 可能是一个想法更新,并发送它。否则很容易搞砸 makefile,从而错过依赖项,意外构建“混合版本”,并且无法重现您发布的内容。

如果它是由开发人员构建的,我之前已经修改过 makefile,因此版本号被故意破坏(设置为“0.0 私有构建”) - 只有构建服务器设置了用于启用正确版本号的选项。对于那个项目,在没有通过标签从源代码控制中检查出来并从那里构建的东西上加上一个数字是没有意义的。

【讨论】:

这似乎是错误的。 version.c 应该依赖于 $(OBJFILES)

以上是关于如何自动创建具有最新编译时间的文件并将其包含到库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 ghc 的分析器深入到库中?

通过 UIActivityViewController 导出 LivePhoto - Swift

试图移动图像文件,为输出目录抛出FileNotFoundException

ORACLE中用PLSQL如何把.DMP文件导入到库中?

ORACLE中用PLSQL如何把.DMP文件导入到库中?

将 Nginx 构建到库中