c - bash 无法执行可执行文件

标签 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

然后我再次运行没有 .o 后缀的 make

#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

最佳答案

.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

关于c - bash 无法执行可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25778655/

相关文章:

linux - 将多个参数传递给 bash

c++ - Linux 终端对比 eclipse

python - 建立大量并行 SSH 连接的 Web 服务器上的脚本,哪种方法更好?

java - Hadoop "Could not find or load main class com.sun.tools.javac.Main"

bash - 如何使用bash杀死远程服务器上的多个进程

c - MPI_Barrier 无法正常工作

c - 将 double as (void *) 传递给函数

c - 如何使用 GDB 查看堆栈的内容?

c - 不明白 tsearch 返回指针是如何工作的

Python communicate() 与 NMap