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++实例代码/*...
Linux下gcc编译过程实例讲解
本次讲解基于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
3.2、编译
编译就是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码,即将相应的高级语言代码映射到汇编语言,处理define,include等命令,加载外部的代码。
gcc -S -o ZYFTest.s ZYFTest.i
3.3、汇编
将汇编语言映射到机器码,即汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现位ELF目标文件(OBJ文件)。
gcc -c -o ZYFTest.o ZYFTest.s
3.4、链接
将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。
gcc -o ZYFTest ZYFTest.o
3.4.1、动态链接
动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。 动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。
gcc -o ZYFTest_Share ZYFTest.o
3.4.2、静态链接
静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过静态链接生成的程序体积较大。
gcc -static -o ZYFTest_Static ZYFTest.o
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
上一篇: iOS14如何增强语音备忘录录音
下一篇: 使用ListView显示手机所有应用