Linux下代码的编译与调试

目录

gcc/g++编译器

gcc编译过程:

编译过程的几个阶段具体如下:

gcc常用选项

静态库和动态库


gcc/g++编译器

当我们进行编译的时候,要使用一系列的工具,我们称之为工具链。SDK就是编译工具链的简写,我们所使用的是gcc系列编译工具链
使用-v参数来查看gcc的版本,从而确定某些语法特性是否可用,比如是否允许使用时声明

gcc -v

对于.c格式的C文件,可以采用gcc或g++编译

对于 .cc、.cpp格式的C++文件,应该采用g++进行编译

常用的选项:
-c 表示编译源文件
-o 表示输出目标文件
-g 表示在目标文件中产生调试信息,用于gdb调试
-D <宏定义> 编译时将宏定义传入进去
-Wall 打开所有类型的警告。

gcc编译过程:

使用gcc编译程序的过程是预处理-->编译-->汇编-->链接。期间所使用的工具依次是预处理器,编译器,汇编器as,链接器

编译过程的几个阶段具体如下:

(1) 预处理:预处理器将对源文件中的宏进行展开,主要的处理以#开头的东西,还可以去除注释,添加行号,展开头文件

可以使用参数-E,生成预处理之后的文件,以i结尾,生成之后的文件还是一个文本文件,还是一个C语言
代码。
gcc -E hello.c -o hello.i

(2) 编译:gcc将c文件编译成汇编文件,会进行语法分析、词法分析、语义分析。
注意:Linux下面不以后缀区分文件

可以使用-S选项,生成汇编代码,以s结尾,生成之后还是一个文本文件,但是是汇编代码
gcc -S hello.i -o hello.s

(3) 汇编:as将汇编文件编译成机器码,使用汇编器将汇编代码生成为目标代码。

使用汇编器as将汇编代码转变为二进制代码,以.o结尾,生成的文件是一个二进制文件。
as hello.s -o hello.o 

(4) 链接:将目标文件和外部符号进行连接,得到一个可执行二进制文件。将上一步生成的二进制文件与其他的文件合在一起打包,生成可执行程序(文件)。

gcc hello.o -o hello

gcc常用选项

静态库和动态库

静态库是目标文件.a的归档文件(格式为libname.a)。如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中;
动态库(格式为libname.so[.主版本号.次版本号.发行号])。在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入

静态库与动态库的比较:
动态库只在执行时才被链接使用不是直接编译为可执行文件,并且一个动态库可以被多个
程序使用,故可称为共享库
静态库将会整合到程序中,在程序执行时不用加载静态库

静态库的可执行程序大,但是动态库的可执行程序小
因此,静态库会使你的程序臃肿并且难以升级,但比较容易部署。而动态库会使你的程序轻
便易于升级
但难以部署.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~|Bernard|

你的鼓励是我写下去最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值