【问题标题】:I overwrote my .c file with a compile. Can I get it back? [closed]我用编译覆盖了我的 .c 文件。我可以拿回来吗? [关闭]
【发布时间】:2015-05-19 04:44:42
【问题描述】:

我正在做一个学校项目。不幸的是,我只是像这样运行编译:gcc -o file.c file.o

我忘了输入输出的可执行文件名,现在我之前的 C 文件不见了。有没有办法找回这个文件?我写了很多代码都没有了。

程序是用 C 语言在 Unix 服务器上编写的。

谢谢!

【问题讨论】:

标签: c unix


【解决方案1】:

有没有办法找回这个文件?

如果您使用的是版本控制系统或进行了备份。如果没有,你很可能不走运。

【讨论】:

    【解决方案2】:

    如果您的编辑器保存了临时文件,它们可能仍然存在。在 unix 下,文件本身已经消失了。很快就会像这个问题一样,因为它超出了 StackOverflow 的范围。

    我认为(正如 Caleb 在我打字时观察到的那样)您学到了使用源代码管理和定期检查的众多充分理由之一。


    当你将错误的代码编译到错误的文件中时会发生以下情况:

    ~ mgregory$ cat > foo.h
    bad code
    ~ mgregory$ cat > foo.c
    test text
    ~ mgregory$ gcc -o foo.c foo.h
    foo.h:1:1: error: unknown type name 'bad'
    bad code
    ^
    foo.h:1:9: error: expected ';' after top level declarator
    bad code
            ^
            ;
    2 errors generated.
    ~ mgregory$ ls -l foo.c
    ls: foo.c: No such file or directory
    ~ mgregory$ 
    

    【讨论】:

    • 我想我真正的问题是:当你 gcc -o file.c file.h 时会发生什么?它是否创建了一个空白名称的可执行文件?我很困惑,因为 file.c 完全消失了
    • 我只是尝试确认:如果您的编译由于错误而失败(很可能如果您尝试编译没有 .c 文件的头文件),则删除目标文件。这是有道理的:它会阻止您运行从旧版本代码生成的“旧”目标文件,忽略当前版本代码无法编译的事实
    • 有趣。很高兴知道。吸取了惨痛的教训,但这是一次积极的经历,有两个原因。 1. 我学会了总是使用版本控制。 2. 我保证我理解我的任务,因为我能够很快地重写程序。
    • 这实际上是最常见的:令人惊讶的是,在你第一次写东西之后,第二次写东西要快得多。任何使用 Microsoft 工具的人都可能在某个时候或其他时候经历过这种情况......(或者至少,曾经是这种情况)。
    【解决方案3】:

    通常不可能取回文件(但细节很痛苦,操作系统和file system 特定;如果在 Linux 笔记本电脑上的 Ext4 文件系统上,您可以尝试 e2fsprogs 中的 debugfs)。你显然有备份,所以使用它们(如果你没有,你已经痛苦地学到了一些重要的东西,而且我们大多数人在我们生命的早期都犯了同样的错误,所以不要太羞耻)。

    现在是您了解version control 系统是什么的时候了。所以请阅读git 并学习使用它。

    如果您的软件使用free software 许可证,您甚至可以使用http://github.com/(或其他类似http://gitlab.com/)作为存储库。

    您可以运行file file.cls -l file.cstat file.c 来了解file.c 的内容。你可以用ls -alst列出最近修改的文件

    顺便说一句,你应该用

    编译你的程序
    gcc -Wall -Wextra -g file.c -o prog
    

    这会要求所有使用-Wall 的警告,甚至更多使用-Wextra 的警告,使用-g 的调试信息。然后你可以在你的程序上使用gdb调试器作为gdb prog

    顺便说一句,您可能希望为GNU make 设置一个Makefile,然后只需键入make 即可编译您的程序。 HereMakefile 的一个简单示例。

    请注意,最近 GCC 能够处理 pre-compiled headers(但对于小型学校项目来说,这不是一个非常有用的功能)。如果你输入了gcc -o file.c file.h,很可能你的头文件file.h已经被预编译成file.c

    【讨论】:

    • 出于好奇,你知道当你这样编译时会发生什么:gcc -o file.c file.h。我以为它只会用可执行文件覆盖我的 c 文件,但 c 文件完全消失了。在这一点上,我只是好奇。
    • 你编译的是file.h还是file.o
    • 命令是:gcc -o file.c file.h(我忘了提供可执行文件名)
    猜你喜欢
    • 2021-08-23
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2015-11-24
    相关资源
    最近更新 更多