【Linux】Linux下的编译器——gcc/g++
创始人
2024-03-31 16:58:27
0


💬推荐一款模拟面试、刷题神器 、从基础到大厂面试题:👉点击跳转刷题网站进行注册学习 


目录

一、编译的过程

1、预处理阶段

1.1预处理的工作——头文件展开、去注释、宏替换、条件编译

1.2外部定义宏(-D选项)

1.3Linux中头文件的路径

2、编译——编译是把C语言处理为汇编语言

3、汇编——把汇编转为可重定向二进制目标文件(不可执行)

4、链接——把自己写的代码和C库中的代码合并成二进制程序(可执行)

二、动态链接和静态链接

1、动态链接

动态链接的优缺点

2、静态链接

静态链接的优缺点

3、程序动、静态链接的区分

3.1查看程序是动、静态的方法

3.2查看程序依赖的动态库

3.3静态程序的生成

3.4关于动、静态库的问答


一、编译的过程

观察编译和链接的内部流程,文件在每一步都发生了什么?

1、预处理阶段

1.1预处理的工作——头文件展开、去注释、宏替换、条件编译

gcc -E text.c -o text.i

-E表示当程序处理完预处理阶段就停下来;

-o指明生成的临时文件的名称(.i)。Linux不认后缀,这个.i是给用户看的。

1.2外部定义宏(-D选项)

gcc text.c -Dc=5//在外部给text.c定义c=5
gcc text.c -DJLY//在外部给text.c定义宏JLY

注意这里在外部定义的宏仅在生成的a.out文件中生效,原text.c文件中并无改变。

1.3Linux中头文件的路径

/usr/include/stdio.h

可以通过vim查看头文件,在头文件中搜索库函数。

可以根据头文件进行代码补齐。

2、编译——编译是把C语言处理为汇编语言

gcc -S text.c -o text.s

-S表示进行程序的编译工作,编译完成之后就停止。

3、汇编——把汇编转为可重定向二进制目标文件(不可执行)

gcc -c text.c -o text.o

4、链接——把自己写的代码和C库中的代码合并成二进制程序(可执行)

gcc text.o
gcc text.c 
gcc text.c -o mytext//将a.out改名为mytext

二、动态链接和静态链接

1、动态链接

通过链接器和库建立链接。可以理解为建立动态链接需要去C标准库等外部库里找对应的函数等。

动态链接的优缺点

优点:形成的可执行程序较小,下载便捷;能够节省磁盘存储空间,且程序加载到内存的时间快。

缺点:依赖动态库,程序的可移植性比较差。(运行时问题)

2、静态链接

静态链接指直接将所需的函数等代码直接加入到程序当中。

静态链接的优缺点

优点:不依赖第三方库,程序的运行可移植性较好。

缺点:形成的可执行程序体积大。

3、程序动、静态链接的区分

3.1查看程序是动、静态的方法

file 可执行程序

3.2查看程序依赖的动态库

ldd 可执行程序

动态库:libxxxx.so

静态库:libxxxx.a

Linux中库的命名:去掉前缀lib,去掉后缀.so,剩下的就是库的名称。例如libc.so.6中所依赖的库为c库。

3.3静态程序的生成

Linux中可执行程序默认使用动态库,那么静态程序可以使用-static。

sudo yum install glibc-static//安装C静态库
sudo yum install libstdc++-static//安装c++静态库
gcc text.c -o mytext_static -static//生成静态程序mytext_static

3.4关于动、静态库的问答

1、如果下载一个C语言写的程序,需不需要下载额外的C标准库?

动态文件所依赖的库基本上变化不大,而静态文件不需要依赖动态库,所以均不用额外下载C标准库。

2、静态链接,拷贝的代码从何而来?

静态链接需要系统中存在.a结尾的静态库,从该静态库中拷贝代码。

如果系统中没有动态链接库,仅有静态链接库,即便不加-static,生成的可执行程序也是静态链接的。

3、Windows下动、静态库的区分

.dll//动态
.lib//静态

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...