gcc下,不加.c的文件,编译后不见了,哪去了?

时间:2021-09-12 12:50:32
例:
# vi hello
#include<stdio.h>
int main()
{
    printf("hello,world\n");
}


==========================================

# gcc hello -o hello
/usr/lib/gcc/....(错误提示)

# cat hello
 现在就已经找不到hello文件了,1) 它到哪去了? 2)系统自动删除了吗 ?  3) 为什么要这么做?

23 个解决方案

#1


不知道楼主是咋回事,我这试了下,虽然也会提示错误,但是文件还在当前目录下的。。。
不知道是不是因为我用MinGW gcc的原因。。。

#2


你保存了吗.

#3


gcc hello -o hello,你把源文件名搞的跟目标文件名相同,肯定会有问题啊,最简单的方法就是换个名呗:
gcc hello -o hello.o

#4


wq

保存了的。是我机器的问题吗?
系统版本是:red hat 2.6.9-42.EL

引用 2 楼  的回复:
你保存了吗.

#5


你生成的文件和源文件一样,覆盖了?

#6


不是,没有生产的文件,并且源文件也没有了!

引用 5 楼  的回复:
你生成的文件和源文件一样,覆盖了?

#7


估计是gcc在建立生成的文件时就把你的源文件清空了,但在编译的时候发现源文件也没有了。
这不能算是什么问题,完全是使用不当造成的。

#8


# vi hello.c
#include<stdio.h>
int main()
{
  printf("hello,world\n");
}

gcc -o hello hello.c

#9



# gcc hello -o xxoo

-o 后面别用相同的名字不就得了。

#10


gcc的规则是先语法判断编译在链接之前先看有无这个程序,如果有就删除,然后进行链接

是链接器的行为

#11


测了一下,确实是这样的,下面编译之后的错误信息:
hello: file not recognized: File truncated
collect2: ld returned 1 exit status
编译器要生成可执行文件,因为-o hello.目标文件是hello,但是编译后有错误:file not recognized.然后就执行:File truncated.可以理解为文件被删除了。
但是你这样编译就没有问题:gcc -Wall hello -o app,hello不会被删除,错误信息如下:
hello: file not recognized: File format not recognized
collect2: ld returned 1 exit status

#12


你生成的文件和源文件一样,覆盖了?

同意楼上的、、

#13


会删除?!
如果编译成功
gcc hello.c -o hello
不是应该有两个文件吗,hello,hello.c


引用 10 楼  的回复:
gcc的规则是先语法判断编译在链接之前先看有无这个程序,如果有就删除,然后进行链接

是链接器的行为

#14


gcc是编译器驱动程序,它根据输入文件的扩展名调用对应的编译器或连接器
你给的没扩展名,gcc没法知道是什么语言的源文件,就直接传给ld
ld的做法是删除-o指定的文件,根据输入的文件链接然后创建-o指定的文件,但由于你这里输入和输出是同一个文件,所以先把-o的删了输入文件也没了

#15


改为.c 扩展名

#16


gcc hello -o hello
这里的-o表示生成的可执行文件的名字叫hello
显然跟你的源文件hello同名了
gcc hello -o hello1
先这样看看有什么结果

#17



gcc hello -o hello


牛人~~

#18


说明gcc有bug,没发现楼主犯下的这种常识性错误。

#19


这不是错误、这是吃多了。。! 要跳。。
  gcc下,不加.c的文件,编译后不见了,哪去了?

 没事找事!

#20


in out 相同了

#21


我擦....我昨晚也干了这么件事, 我把 GCC -O list.c list.c 
然后 ./list.c 就可以执行了. 原来的 list.c 文件内容没了. 这个"list.c" 是二进制可执行文件. gcc下,不加.c的文件,编译后不见了,哪去了?

#22


gcc hello.o -o hello

#23


我在我电脑上试过:
提示错误:
gcc hello -o hello.o
hello: file not recognized: File format not recognized
collect2: ld 返回

同样hello 会丢失。原因我认为是gcc生成hello覆盖掉vi 编写的hello(gcc在文件系统上重新生成hello文件名,此时就算vi 编写的hello不丢失,里面的数据也会改变),同时由于GCC编译出错,最终不能生成Hello文件,此时就会退出,hello文件此时就会消失。

#1


不知道楼主是咋回事,我这试了下,虽然也会提示错误,但是文件还在当前目录下的。。。
不知道是不是因为我用MinGW gcc的原因。。。

#2


你保存了吗.

#3


gcc hello -o hello,你把源文件名搞的跟目标文件名相同,肯定会有问题啊,最简单的方法就是换个名呗:
gcc hello -o hello.o

#4


wq

保存了的。是我机器的问题吗?
系统版本是:red hat 2.6.9-42.EL

引用 2 楼  的回复:
你保存了吗.

#5


你生成的文件和源文件一样,覆盖了?

#6


不是,没有生产的文件,并且源文件也没有了!

引用 5 楼  的回复:
你生成的文件和源文件一样,覆盖了?

#7


估计是gcc在建立生成的文件时就把你的源文件清空了,但在编译的时候发现源文件也没有了。
这不能算是什么问题,完全是使用不当造成的。

#8


# vi hello.c
#include<stdio.h>
int main()
{
  printf("hello,world\n");
}

gcc -o hello hello.c

#9



# gcc hello -o xxoo

-o 后面别用相同的名字不就得了。

#10


gcc的规则是先语法判断编译在链接之前先看有无这个程序,如果有就删除,然后进行链接

是链接器的行为

#11


测了一下,确实是这样的,下面编译之后的错误信息:
hello: file not recognized: File truncated
collect2: ld returned 1 exit status
编译器要生成可执行文件,因为-o hello.目标文件是hello,但是编译后有错误:file not recognized.然后就执行:File truncated.可以理解为文件被删除了。
但是你这样编译就没有问题:gcc -Wall hello -o app,hello不会被删除,错误信息如下:
hello: file not recognized: File format not recognized
collect2: ld returned 1 exit status

#12


你生成的文件和源文件一样,覆盖了?

同意楼上的、、

#13


会删除?!
如果编译成功
gcc hello.c -o hello
不是应该有两个文件吗,hello,hello.c


引用 10 楼  的回复:
gcc的规则是先语法判断编译在链接之前先看有无这个程序,如果有就删除,然后进行链接

是链接器的行为

#14


gcc是编译器驱动程序,它根据输入文件的扩展名调用对应的编译器或连接器
你给的没扩展名,gcc没法知道是什么语言的源文件,就直接传给ld
ld的做法是删除-o指定的文件,根据输入的文件链接然后创建-o指定的文件,但由于你这里输入和输出是同一个文件,所以先把-o的删了输入文件也没了

#15


改为.c 扩展名

#16


gcc hello -o hello
这里的-o表示生成的可执行文件的名字叫hello
显然跟你的源文件hello同名了
gcc hello -o hello1
先这样看看有什么结果

#17



gcc hello -o hello


牛人~~

#18


说明gcc有bug,没发现楼主犯下的这种常识性错误。

#19


这不是错误、这是吃多了。。! 要跳。。
  gcc下,不加.c的文件,编译后不见了,哪去了?

 没事找事!

#20


in out 相同了

#21


我擦....我昨晚也干了这么件事, 我把 GCC -O list.c list.c 
然后 ./list.c 就可以执行了. 原来的 list.c 文件内容没了. 这个"list.c" 是二进制可执行文件. gcc下,不加.c的文件,编译后不见了,哪去了?

#22


gcc hello.o -o hello

#23


我在我电脑上试过:
提示错误:
gcc hello -o hello.o
hello: file not recognized: File format not recognized
collect2: ld 返回

同样hello 会丢失。原因我认为是gcc生成hello覆盖掉vi 编写的hello(gcc在文件系统上重新生成hello文件名,此时就算vi 编写的hello不丢失,里面的数据也会改变),同时由于GCC编译出错,最终不能生成Hello文件,此时就会退出,hello文件此时就会消失。