linux下的.o文件是不是分可执行的.o还有obj类型的.o??望求解!谢谢各位大侠!

是这样的 我用“gcc -o helloworld.o helloworld.c” 生成的helloworld.o文件 和用makefile生成的helloworld.o貌似不是一个东西,makefile生成的.o文件不是可执行文件,而是类似obj那种目标文件,这两个.o一个能运行 一个不能运行,我就不是太明白,是不是gcc生成的.o文件其实不是obj文件,还是可执行文件?
makefile如下:CC=gcc
EXEC=hello
OBJS=hello.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) -o $@ $(OBJS)
clean:
-rm -f $(EXEC)*.o
可是我用命令生成的那个.o文件是可以运行的文件啊 是不是这个.o不算是obj文件 而是可执行文件?
他是不是和makefile生成的那个obj文件不是一个意思?

“你用命令生成的helloworld.o是-o参数的值”这句话不是太明白。。。呵呵
谢谢啦

你用makefile生成的.o实际上不是用参数-o带出来的,你用命令生成的helloworld.o是-o参数的值。很明显你后面makefile最后执行的是gcc -o hello hello.o, 两个命令不一样的。追问

这样啊 可是我试了下gcc -o hello hello.o 显示的是:
/usr/bin/ld: hello.o: Relocations in generic ELF (EM: 40)
hello.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
没法生成hello文件。

“你用命令生成的helloworld.o是-o参数的值。”这句话啥意思?是不是我用gcc命令生成的那个.o文件不是真正的obj文件?

追答

简单一点说生成可执行文件有两种方法
gcc -o hello hello.c
这个是直接生成了可执行文件

gcc -c hello.o hello.c
gcc -o hello hello.o
这个是先生成object文件,然后再生成可执行的文件
因为你这个只有一个.c, 如果有多个文件,其中只有一个是有main函数的,那么可以先生成每个.c对应的.o文件,再最后生成要执行的一个文件。用-o的时候一定要有一个main函数

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-11
gcc -o helloworld.o helloworld.c
这句命令其实生成就是把helloworld.c编译链接生成可执行文件放到helloworld.o文件里面,你把helloworld.o写成helloworld.a,helloworld.b什么的都可以,反正是个可执行文件
第2个回答  2011-08-11
1linux中文件是否能够运行不是由扩展名决定的,而是由是否有执行权限来决定的。
与windows不一样。
执行gcc -o helloworld.o helloworld.c后,gcc为helloworld.o赋予了执行权限,所以能运行。
2、惯例是可执行文件不带扩展名:
gcc -o helloworld helloworld.c
相似回答