Linux基础05(Linux上C/C++程序的编译与调试&库文件)

第五章、Linux上C/C++程序的编译与调试&库文件

1.编译工具的安装

2.gcc和g++的使用及区别

gcc和g++的区别:
1.gcc 默认只会连接c标准库,g++会默认连接c++标准库
2.gcc对于.c文件是以c语言方式编译
.cpp文件是以c++方式编译
g++对于.c和.cpp文件都是以c++方式编译

如何用gcc编译c++
gcc main.cpp -o main -lstdc++

3.编译链接的过程及分步编译过程

预编译:删除注释,处理预编译指令#,
编译:语法、词法分析,代码优化,汇总符号(数据(全局变量,全局数据,静态变量) 、函数)
局部变量是指令 只有执行到局部变量时才会开辟空间
汇编:将汇编指令翻译成二进制、生成各个段section、生成符号表 .o可重定位的二进制目标文件
==编译阶段(上面三个阶段统称):==每个.c/.cpp文件都是单独编译
链接:1. 合并文件的各个段,调整段的大小以及段的起始位置,合并符号表,进行符号解析,给符号分配虚拟地址 2.符号重定位 LOCAL(局部 static) GLOBAL(全局) 只解析全局符号
中间文件.o文件的ELF格式组成

预编译:gcc -E main.c(源文件) -o main.i -------->main.i
编译: gcc -S main.i ------>main.s
汇编: gcc -c main.s ------>main.o可重定位的二进制目标文件
链接: gcc main.o -o main ------->main 可执行文件
gcc main.o -------->a.out 可执行文件(ELF格式的文件)
在真正编译时,可以不写预编译和编译直接写汇编
常用的用法: gcc main.c -o main ------>直接生成main可执行文件
有多个文件时写法:gcc main.c list.c vector.c -o main

4.make与makefile

makefile

1.makefile基本写法

makefile写法格式
make过程
makefile原理

2.makefile多文件情况

makefile多文件情况

3.makefile优化版

makefile简化版

4.makefile存在子文件情况

makefile有子文件的写法

5.gdb调试:

调试的时候会生成两个版本
debug版本:调试版本—>程序员
release版本:发行版本---->用户
gcc默认生成的是release版本的可执行文件,如果要生成debug版本,需要添加一个选项 -g

如果是分步生成可执行文件,则需要在编译阶段加入-g,生成debug版本的中间文件

l —>显示main函数所在的文件的代码
list filename:line 显示filename文件line行上下的代码
断点管理:
b 行号 给指定的行添加一个断点
b 函数名 给指定的函数的有效的第一行添加一个断点
info b 显示所有断点的信息
disable 断点号 将断点设置为无效
enable 断点号 将断点设置为有效
d 断点号 删除断点
调试过程:
r 开始执行,直接执行到运行过程中的第一个断点处
n 单步执行
s 逐语句执行 进入函数去执行
finish 跳出函数
c 继续执行(continue),直接执行到下一个断点处
q 退出调试

查看变量的值:
p valname 显示变量的值
p &valname 显示变量的地址
p 表达式 显示表达式的结果
p 函数(实参) 显示函数执行结果
display 同p 自动显示,参数和p相同
info display -------> 显示display信息
undiaplay + display编号 删除指定的自动显示
ptype valname 显示变量的类型

打印数组元素的值:
int arr[10]={1,2,3,4,5,6,7,8,9,0}; ------> p arr 打印数组所有元素的值
int *ptr=arr; ------>p *ptr@len 打印数组所有元素的值
------>p ptr 显示ptr这个变量的值(数组的首地址)
------>p *ptr 显示ptr这个地址里面存储的值
结构体变量:
struct Node struct Node head; struct Node *p=&head;
{ p head p p->data;
int data; p head.data p p->next;
struct Node *next; p head.next
};

bt 显示函数调用栈 显示函数调用的经过
适用于:函数调用层大,有些函数是共用的函数

6.库文件的生成与使用

库文件:将用户写好的程序打包成一个整体,当其他模块或者其它用户使用时,只需要有这个库文件就行。
libc.so ----> stdio.h string.h math.h rand.h time.h
libstdc++.so -->STL

1.静态库

windows: .lib
Linux: .a

1.生成

1.将所有的源代码(不能带有main方法的源文件)文件编译成中间文件(.o)
2.使用命令 ar crv libxxxx.a 所有的中间文件

2.使用

gcc -o main main.c -L库的路径 -l库的名称(xxxx)
==注:==如果没有给库的路径,则会去默认路径下查找: /lib 或者 /usr/lib

2.共享库(动态库)

windows: .dll
Linux: .so

1.生成

gcc -shared -fPIC -o libxxxx.so 所有功能代码的源文件

2.使用

gcc -o main main.c -L库的路径 -l库的名称(xxxx)
==注:==如果没有给库的路径,则会去默认路径下查找: /lib 或者 /usr/lib
库文件
静态库和动态库的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值