我正在尝试使用 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/