【问题标题】:How do you ascertain that you are running the latest executable?您如何确定您正在运行最新的可执行文件?
【发布时间】:2016-08-25 16:37:22
【问题描述】:

我经常(重新)编译一些我正在处理的 C(或 C++)文件 - 顺便说一句,它在没有任何警告的情况下成功 - 然后我执行我的程序只是意识到 什么都没有改变自从我之前的编译。为简单起见,假设我在源代码中添加了一条指令,将一些调试信息打印到屏幕上,这样我就有了问题的视觉证据:确实,我编译、执行,但意外地什么都没有打印到屏幕上.

当我有一个错误的代码(我跑出静态数组的边界)时,我曾经发生过这种情况。当然,如果您的代码有某种隐藏 错误 (What are all the common undefined behaviours that a C++ programmer should know about?),则编译后的代码几乎可以是任何东西。

这发生了两次,当时我使用了一些慢得离谱的网络硬盘驱动器——我猜——只是没有在编译后更新我的可执行文件,我一直在运行旧的版本,尽管更新了源。我只是在这里推测,如果这种现象是不可能的,请随时纠正我,但我怀疑它必须与某些进程有关waiting for IO

好吧,当您在错误的目录中执行旧版本时(即:您执行的东西类似,但实际上与您的来源)。

这又发生了,让我很恼火的是:你如何确保你的可执行文件与你正在处理的源代码相匹配?我应该在主函数中比较源的日期字符串和可执行文件吗?我应该删除之前编译的可执行文件吗?我猜人们可能会通过version control 做类似的事情。


注意:有人警告我,这可能是一个主观主题,可能注定要关闭。

【问题讨论】:

  • 我确实在一个命令中编译和运行,即make hoge && ./hoge,但这不会阻止我在不保存编辑器上编辑的内容的情况下进行编译。
  • 确实,忘记保存源文件是此类麻烦的另一个来源......
  • 流程,流程,流程。尽可能自动化构建和部署,因此您只需键入./build foo,构建脚本每次都会自动将所有内容放在需要的位置。任何手动方法都注定失败。
  • 我可以从一个批处理文件运行我的编译器,它会在编译之前删除所有目标文件和可执行文件。我的程序还会在终端上或在窗口标题中(视情况而定)宣布它们的名称和版本号。
  • @Weather 你的文件会被真的删除吗?如果可执行文件当前正在使用怎么办?见unix.stackexchange.com/questions/49299/…

标签: c++ c linux version-control operating-system


【解决方案1】:

只需使用 ol' 好的版本控制可能性

  1. 在简单的情况下,您只需在代码中添加(任何)可见版本 ID 并检查它(哈希、修订 ID、时间戳)
  2. 如果您的项目有很多依赖文件,并且您怀疑生成的代码中的版本比“最新”版本更旧,您可以(除了,显然是好的 makefile 规则)还监控每个文件的版本,用于构建代码(依赖于 VCS,但不是那么重的技巧)

【讨论】:

    【解决方案2】:

    检查可执行文件的时间戳。这应该给你一个关于它是否是最近/最新的提示。 或者,为您的可执行文件计算校验和并在启动时显示它,然后您就会知道如果 csum 相同,则可执行文件没有更新。

    【讨论】:

    • 我建议这样做,但这样做似乎很奇怪。这是业内人士在做的事情吗?
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 2020-12-03
    相关资源
    最近更新 更多