【发布时间】: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