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