欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Linux下gcc编译过程实例讲解

程序员文章站 2022-06-17 18:34:17
Linux下gcc编译过程实例讲解1、Linux下C/C++编译原理及过程2、C++实例代码3、gcc编译过程3.1、创建代码3.1、预处理3.2、编译3.3、汇编3.4、链接3.4.1、动态链接3.4.2、静态链接3.4.3、其他3.4.3.1、nostdlib3.4.3.2、nostartfiles本次讲解基于C++,在ubuntu下编译一段实例代码,详细讲解gcc的编译过程。通过本教程,你将掌握Linux下gcc编译过程和原理。1、Linux下C/C++编译原理及过程2、C++实例代码/*...


本次讲解基于C++,在ubuntu下编译一段实例代码,详细讲解gcc的编译过程。
通过本教程,你将掌握Linux下gcc编译过程和原理。

1、Linux下C/C++编译原理及过程

详见我的博客:
Linux下C/C++编译原理及过程https://blog.csdn.net/Zhangyanfeng1/article/details/111028540

2、C++实例代码

/*!
* Copyright (c) 2020,ZYF.
* All Rights Reserved.
*
* \file main.c
* \brief 测试
*
* \author ZYF
* \date 2020/12/09 23:28:20
* \version 1.0.0
*/

#include <stdio.h>

#define   MAX  500 
#define   MIN  20 

#define  _DEBUG
#define   SetBit(x)  (1<<x) 

int main(int argc, char* argv[])
{
    printf("ZYF Start \n");
    printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN); 

#ifdef _DEBUG
    printf("SetBit(5) = %d,SetBit(6) = %d\n",SetBit(5),SetBit(6));
    printf("SetBit( SetBit(2) ) = %d\n",SetBit( SetBit(2) ));		
#endif    
    
    printf("ZYF End \n");
	return 0;
}

3、gcc编译过程

3.1、创建代码

zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ ls
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ vim main.c
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ ls
main.c
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ cat main.c 
/*!
* Copyright (c) 2020,ZYF.
* All Rights Reserved.
*
* \file main.c
* \brief 测试
*
* \author ZYF
* \date 2020/12/09 23:28:20
* \version 1.0.0
*/

#include <stdio.h>

#define   MAX  500 
#define   MIN  20 

#define  _DEBUG
#define   SetBit(x)  (1<<x) 

int main(int argc, char* argv[])
{
    printf("ZYF Start \n");
    printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN); 

#ifdef _DEBUG
    printf("SetBit(5) = %d,SetBit(6) = %d\n",SetBit(5),SetBit(6));
    printf("SetBit( SetBit(2) ) = %d\n",SetBit( SetBit(2) ));		
#endif    
    
    printf("ZYF End \n");
	return 0;
}
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ 

3.1、预处理

将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理。

gcc -E -o ZYFTest.i main.c

Linux下gcc编译过程实例讲解

3.2、编译

编译就是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码,即将相应的高级语言代码映射到汇编语言,处理define,include等命令,加载外部的代码。

gcc -S -o ZYFTest.s ZYFTest.i

Linux下gcc编译过程实例讲解

3.3、汇编

将汇编语言映射到机器码,即汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现位ELF目标文件(OBJ文件)。

gcc -c -o ZYFTest.o ZYFTest.s

Linux下gcc编译过程实例讲解

3.4、链接

将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

gcc -o ZYFTest ZYFTest.o

Linux下gcc编译过程实例讲解

3.4.1、动态链接

动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。 动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。

gcc -o ZYFTest_Share ZYFTest.o

Linux下gcc编译过程实例讲解
Linux下gcc编译过程实例讲解

3.4.2、静态链接

静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过静态链接生成的程序体积较大。

gcc -static -o ZYFTest_Static ZYFTest.o

Linux下gcc编译过程实例讲解Linux下gcc编译过程实例讲解

3.4.3、其他

3.4.3.1、nostdlib

不链接系统标准启动文件和标准库文件。

gcc -v -nostdlib -o ZYFTest_Nostdlib ZYFTest.o

3.4.3.2、nostartfiles

不链接系统标准启动文件,而标准库文件仍然正常使用。

gcc -v -nostartfiles -o ZYFTest_Nostartfiles ZYFTest.o

本文地址:https://blog.csdn.net/Zhangyanfeng1/article/details/110928755