加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用最新编译时自动创建文件并将其包含到库中?

发布时间:2020-12-16 10:15:16 所属栏目:百科 来源:网络整理
导读:我有一个包含大约100个源文件的库.如果已经编译了任何其他文件,我希望其中一个源始终重建,但我不希望每次运行make / build时都构建它. 基本上我希望这个文件内置最后的构建日期/时间,因此链接到库的任何应用程序都可以检查上一个构建时间/日期.有没有其他方
我有一个包含大约100个源文件的库.如果已经编译了任何其他文件,我希望其中一个源始终重建,但我不希望每次运行make / build时都构建它.

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

解决方法

略微扩展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,以免错过依赖,意外地构建“混合版本”,并且无法重现你发送的内容.

我之前已经使用过makefiles,以便版本号被故意破坏(设置为“0.0 private build”),如果它是由开发人员构建的 – 只有构建服务器设置用于启用正确版本号的选项.对于那个项目来说,将一个数字放在没有通过标签检查源代码控制的东西上并且从那里构建它是没有意义的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读