一、多文件链接的方法
1.多文件链接的一般方法
- 给出所要调用的函数声明及实现方法
cat max.h
int max(int x,int y); //max函数的声明
cat max.c
#include"max.h"
int max(int x,int y)
{
return x>y?x:y;
} //max函数的实现方法
cat add.h
int add(int x,int y); //add函数的声明
cat add.c
#include"add.h"
int add(int x,int y)
{
return x+y;
} //add函数的实现方法
- 将写好的.c文件编译成.o文件
gcc -c max.c
gcc -c add.c //用这两个命令将两个.c文件编译成.o文件
此时的两个程序不能单独链接成可执行文件,因为可执行文件需要主函数。
- 写出需要调用上面两函数的程序
cat main.c
#include<stdio.h>
#include"add.h"
#include"max.h"
int main()
{
int a=2,b=3;
printf("add=%d\n",add(a,b));
printf("max=%d\n",max(a,b));
return 0;
} //主程序
gcc -c main.c //将main.c文件编译成main.o文件;
- 将所有就绪的.o文件连接成可执行的main程序
gcc -o main.o max.o add.o //此命令将所有就绪的.o文件连接成可执行的main程序
- 执行main程序
./main //此命令执行main程序
2.多文件链接的makefile方法
Makefile是用来管理工程,实现自动化编译的工具,和VS中的程序的编译执行是对应的。
makefile文件的写法:
注意: gcc 前面必须是 table 建缩进

make 命令根据 makefile 文件的规则生成可执行程序

二、调试
程序运行时有两个版本:
- Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人
员,最常用的就是 debug 版本的可执行文件。 - Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版
本。
我们调试的是一个可以执行的程序。调试的命令为gdb。
1.安装gdb的命令:
sudo apt install gdb
2.单进程、单线程基础调试命令
- l //显示 main 函数所在的文件的源代码
- list 文件名:num //显示 filename 文件 num 行上下的源代码
- b 行号 //给指定行添加断点
- b 函数名 //给指点函数的第一有效行添加一个断点
- info break //显示断点信息
- delete 断点号 //删除指定断点
- disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效
- enable 断点号 //将断点设定为有效的,不加断点号,将所有断点设置为有效
- r(run) //运行程序
- n(next) //单步执行
- c (continue) //继续执行,直接执行到下一个断点处
- s //进入将要被调用的函数中执行
- finish //跳出函数
- q //退出调试
- p val //打印变量 val 的值
- p &val //打印变量 val 的地址
- p a+b //打印表达式的值
- p arr(数组名)//打印数组所有元素的值
- p *parr@len //用指向数组的指针打印数组所有元素的值
- display //自动显示,参数和 p 命令一样
- info display //显示自动显示信息
- undisplay + 编号 //删除指定的自动显示
- ptype val //显示变量类型
- bt //显示函数调用栈
3.基础调试
在Linux系统下,我们编译程序时,默认是Release 版本,切换到Debug 版本是需要加入参数的。

以下给出常用命令的示例:
-
gdb +文件名,开始调试程序

-
L是显示命令,一般默认显示10行,程序太长时,接着使用L命令会接着上一次的显示。

-
b加断点:b+数字表示在第几行加断点。info break是显示断点信息。

-
r是执行程序。如图程序执行时停在11行断点处。

-
c是从上一个断点处开始执行,执行到下一个断点处停下。

-
n是单步执行程序,p是打印。

-
finish结束调试
本文介绍了在Linux环境下,如何进行多文件链接,包括一般方法和使用makefile的方法,并详细讲解了程序调试,包括gdb的安装、调试命令及调试流程,帮助开发者掌握Linux下的程序构建和调试技巧。

1284

被折叠的 条评论
为什么被折叠?



