【Linux】Linux中的gcc/g++编译器的使用


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

实训项目


目录

区别

一、编译的过程

datagridview

1、预处理阶段

稀疏学习

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

内存越界

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

rabbitmq

1.3Linux中头文件的路径

神经网络

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

ConvNeXt

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

QFusion

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

Spring中的依赖注入

二、动态链接和静态链接

随笔

1、动态链接

网络工程师

动态链接的优缺点

抓包

2、静态链接

wincc

静态链接的优缺点

csrf

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

java8 stream

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

欧洲杯

3.2查看程序依赖的动态库

微信登录APP

3.3静态程序的生成

高德定位

3.4关于动、静态库的问答

bean的生命范围


一、编译的过程

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

setter与构造器注入

tkinter

1、预处理阶段

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

gcc -E test.c -o test.i

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

ONNX

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

widget

java参考手册

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

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

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

1.3Linux中头文件的路径

/usr/include/stdio.h

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

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

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

gcc -S test.c -o test.s

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

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

gcc -c test.c -o test.o

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

gcc test.o
gcc test.c 
gcc test.c -o mytest//将a.out改名为mytest

二、动态链接和静态链接

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 test.c -o mytest_static -static//生成静态程序mytest_static

3.4关于动、静态库的问答

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

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

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

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

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

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

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注