bash无法执行可执行文件

时间:2014-09-11 03:38:33

标签: c linux bash gcc

我正在尝试使用make实用程序在我的Linux上编译c程序 如果我尝试创建.o文件

,会发生什么
#make size_of.o
cc    -c -o size_of.o size_of.c

编译过程正确运行,但是当我执行可执行文件时出现此错误

#./size_of.o
bash: ./size_of.o: cannot execute binary file

然后我再次运行make而不使用.o后缀

#make size_of
cc   size_of.o   -o size_of

编译和执行过程按我的预期运行。

该程序有任何问题,或者您能告诉我哪些错误? 我该如何解决这个问题,C中的可执行文件之间有什么不同吗?

这个程序:

#include <stdio.h>

int main (void){
printf("char %d bytes\n",sizeof(char));
printf("short %d bytes\n",sizeof(short));
printf("int %d bytes\n",sizeof(int));
printf("long %d bytes\n",sizeof(long));
printf("float %d bytes\n",sizeof(float));
printf("double %d bytes\n",sizeof(double));
printf("long double %d bytes\n",sizeof(long double));   
return 0;
}

这是输出:

char 1 bytes
short 2 bytes  
int 4 bytes
long 4 bytes
float 4 bytes
double 8 bytes
long double 12 bytes

2 个答案:

答案 0 :(得分:4)

.o个文件是对象文件,而不是可执行文件。您已经专门告诉编译器只创建目标文件,因为您使用了-c标志。您不会运行目标文件,它们会将链接(以及其他内容)提供给链接器以创建可执行文件。

一般(简化)流程是:

Phase
-----
          +---------+
          | main.c  | (source)
          +---------+
               |
Compile........|............................
               |
               V
          +---------+              +-----------+
          | main.o  | (object)     | libs etc. |
          +---------+              +-----------+
               |                         |
Link...........|.........................|....
               |                         |
               +-------------------------+
               |
               V
          +---------+
          |  main   | (executable)
          +---------+

您可以通过将目标文件转换为可执行文件来解决此问题,因为您已在此过程中完成此操作,但我会这样做:

cc -o size_of size_of.o

或者直接从源文件创建可执行文件:

cc -o size_of size_of.c

而且,如果您正在使用make,请确保您拥有实际的Makefile。否则,您将获得可能不是您想要的默认规则。它可以很简单:

size_of: size_of.c Makefile
    gcc -o size_of size_of.c

答案 1 :(得分:0)

在第一个make调用中,您将make target设置为目标文件(target具有.o扩展名)。对象文件的内置make规则只是编译和汇编它们(没有链接),这就是你得到一个目标文件。

第二次调用实际上是要求make构建可执行文件。

Gnumake为不同的目标制定了一套内置规则。有关详细信息,请参阅此链接:

https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html