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

时间:2016-11-09 01:45:55

标签: c

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

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

由于这个错误的命令,我收到错误消息:

Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64

此后,文件test1.c将被删除。

我很好奇导致删除的原因是什么?

谢谢。

1 个答案:

答案 0 :(得分:2)

您的命令输出到test1.c,命令失败,因此会有效删除该文件。

cc -std=c99 -Wall -Werror -pedantic -o output test1.c test2.c
                                     ^ the output flag

我已修改您的命令以将程序输出到./output

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

关于为什么cc删除文件的问题:我运行了strace -f cc -o test1.c test2.c以了解有关它正在做什么的更多信息。在strace输出的某个时刻,你会看到这一行:

[pid XXXXX] unlink("test1.c")           = 0

unlink会删除文件,请在man 3 unlink了解更多信息。

我认为cc删除文件的原因是cc认为它是文件的创建者,因此正在尝试自行清理。