为什么这种不正确的编译和链接会导致我的C源文件被删除?
我注意到错误的编译和链接命令会导致删除我的一个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 我很好奇是什么导致
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找到一个等价物;并阅读有关其工作原理的文档。