linux 中,gcc -c 产生目标代码,-o连接文件。其实很多时候直接-o就可以了,为什么要-c呢?

2024-11-06 08:20:10
推荐回答(4个)
回答(1):

-o 表示产生目标文件。
-c 表示只编译代码但不进行链接,加改参数生成的目标文件是不能执行的(我们常用的链接库就是这样得来的)。

通常在只有一个源文件的情况下不需要加-c。但实际上大多数情况下C程序远不止1个源文件,当main函数需要调用不在同一源文件下的函数时就需要链接到包含该函数的目标文件。
举个例子:
/*main.c*/
#include
int main(){
test();
}

/*test.c*/
#include
extern void test(){
}

编译步骤:
gcc -c test.c -o test
gcc test main.c -o main

回答(2):

在一些大型的项目中,程序的源文件不止一个,而且也不一定是一个人编写的,比如有一个C编写项目,包含3个c文件,分别是:main.c subfun1.c subfun2.c
分别由三个人编写,在main.c中调用了其他两个文件中的函数.
现在,subfun1.c编写好了,就可以先编译一下
:gcc -c subfun1.c 如果编译生成subfun1.o说明语法没错误,这个就OK了,等其他连个文件也编写好了,分别编译一下,连接起来就行了.

回答(3):

是为了教学方便。。

书上这么写是为了让你知道,将源代码编译成可执行程序的大概过程,起码让你们知道有目标代码这种文件。

回答(4):

-c只编译不链接,生成object文件
如果不加-c只使用-o选项,gcc会调用ld来链接生成可执行的二进制文件
与-c类似的选项有-E只预处理,-s生成汇编文件