为什么这种不正确的编译和链接会导致我的C源文件被删除?

为什么这种不正确的编译和链接会导致我的C源文件被删除?,c,C,我注意到错误的编译和链接命令会导致删除我的一个C源文件 假设我有两个源文件和一个头文件:test1.c、test2.c和header.h。然后,我错误地尝试用shell命令cc-std=c99-Wall-Werror-pedantic-o test1.c test2.c编译并链接这些文件 由于此错误命令,我收到错误消息: 架构x86_64的未定义符号: “_main”,引用自: 主可执行文件的隐式输入/启动 ld:未找到架构x86_64的符号 在此之后,删除文件test1.c 我很好奇是什么导致

我注意到错误的编译和链接命令会导致删除我的一个C源文件

假设我有两个源文件和一个头文件:
test1.c
test2.c
header.h
。然后,我错误地尝试用shell命令cc-std=c99-Wall-Werror-pedantic-o test1.c test2.c编译并链接这些文件

由于此错误命令,我收到错误消息:

架构x86_64的未定义符号: “_main”,引用自: 主可执行文件的隐式输入/启动 ld:未找到架构x86_64的符号

在此之后,删除文件
test1.c

我很好奇是什么导致了删除,为什么


谢谢。

您的命令正在输出到
test1.c
,命令失败,因此有效地删除了文件

cc -std=c99 -Wall -Werror -pedantic -o output test1.c test2.c
                                     ^ the output flag
我已经修改了您的命令,将程序输出到
/output


[由于评论中的进一步问题而编辑]

至于为什么
cc
删除该文件的问题:我运行了
strace-fcc-otest1.ctest2.c
以了解更多关于它在做什么的信息。在strace输出的某个点上,您可以看到这一行:

[pid XXXXX] unlink("test1.c")           = 0
unlink
将删除一个文件,请阅读
man 3 unlink
中的更多内容


我相信
cc
删除文件的原因是
cc
认为它是文件的创建者,因此正在尝试清理文件本身

-o test1.c
-o
选项告诉编译器将输出放入该文件中。如果您阅读gcc文档中关于
-o
选项的内容不清楚,您可以自己解决一些问题?@Olaf文档中哪里解释了删除此选项的原因?我不是问
-o
做什么。我问它为什么选择删除文件,而不是仅仅留下它并打印一个错误。因此,在
cc…
过程中的某个时刻,程序以以下模式打开
test1.c
open(“test1.c”,O|RDWR | O|create | O|TRUNC,0666)
,这意味着它将文件截断为0。然后运行
unlink(“test1.c”)
,删除文件。如果您想亲自查看,可以运行以下命令:
strace-fcc-otest1.ctest2.c&>output;grep“test1.c”输出
——显示系统调用。您还可以阅读有关
man unlink
的更多信息。我认为它这样做是因为CC相信它是该文件的创建者,因此正在努力清理它自己。这就是我一直在寻找的。谢谢。@ThePointer-如果您有语法错误,它将不会删除
test1.c
。实际发生的是
gcc
编译的
test2.c
。它从未编译过
test1.c
作为输出目标。然后调用
ld
,将临时目录中存储的对象文件与随机文件名链接起来
ld
清除了输出目标,无法从
test1.c
中找到从未编译过的
main()
。运行
strace-f gcc-o test1.c test2.c
将显示它。@指针-要么你没有运行Linux,要么
strace
包没有安装。啊,对了--strace是Linux特有的东西。你需要为OSX找到一个等价物;并阅读有关其工作原理的文档。