当前位置:   article > 正文

Linux C程序的编译连接及调试工具(gdb)、库文件、动态库与静态库的区别_linux gdb 静态编译

linux gdb 静态编译

查看文件内容

cat filename

more filename

less filename

head -n filename (查看文件前n行)

tail -n filename (查看文件后n行)

C程序的编译连接

 

 Linux 调试工具  gdb

编译过程中加入debug信息:gcc  -c  main.c  -g

链接不会加入debug信息:gcc  -o main main.o    (-o重命名)

 

gdb调试

l                                        显示源代码(默认显示main函数所在文件的源代码)

list  filename :num         显示制定文件指定行附近的源代码

b    linenum                      给指定行添加断点

b    funactionname           给指定函数添加断点

b    filename :linenum      给指定文件的指定行添加断点

b   linenum if                    条件

info b                               显示断点信息

d bpnum                          删除断点

disable   bpnum               将断点设置为无效的

enable  bpnum                 将断点设置为有效的

执行过程控制

r              启动调试

finish      退出函数执行

q             退出调试

n             执行下一步

s             进入函数中执行

c             继续运行,运行到下一个断点处

 

p  valname       查看变量的值

p  &valname     查看变量的地址

p  *ptr               指针指向的地址存储的值

p  arr                显示数组所有的元素

p *ptrarr@num    通过指向数组的指针显示数组所有的元素

p struct_val         显示结构体里所有的成员值

p struct  -val.a  (.a  成员名)显示结构体变量中某个成员的值

p  syruct→a                       通过指针显示结构体变量某个成员的值

p  funactionname(a,b)     将函数测试运行

 

bt              显示函数调用栈       函数调用流程

 

链接文件

文件系统

Linux  文件系统  EXT4    索引式文件系统

U盘                     FAT32  链接式

windows              NTFS

 

EXT4:磁盘格式化时,将磁盘空间分为三部分:inode、block、superblock

superblock:存储整个文件系统的信息,包括inode&block的总量、使用量、剩余量。

inode:存储文件的属性信息,包括文件的权限、用户……block的编号。

block:存储文件的真实内容。

什么是库?

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

库文件:是某些功能代码的集合

        库文件中不允许有main函数

              

 

 

静态库

静态库是功能代码编译完成后的中间文件的集合。

静态库的生成:

gcc     -c   *.c(.c文件)→*.o

ar       crv    libxxx.a     .o(所有.o文件)→libxxx.a(静态库)

库的使用:

1、gcc   -o   main  main.c  -L(库的路径)   -l(库名称)

2、gcc   -o   main  main.c   路径/libxxx.a

特点:

1、静态库对函数库的链接是放在编译时期完成的。

2、程序在运行时与函数库再无瓜葛,移植方便。

3、浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

动态库

链接阶段仅仅是让可执行文件知道所用的功能代码在哪个库中。执行时,由操作系统将动态库单独动态加载到内存上执行。

动态库的生成:

gcc    -shared  -fPIC  -o    libxxx.so   *.c

gcc     -o   main    main.c   -L(库的路径)   -l(库名称)

操作系统加载动态库路径:  /lib      /usr/lib

1、将动态库拷贝到 /lib或者  /usr/lib    (只有root用户有权限)

2、设置环境变量      使操作系统加载库时除了在默认路径下搜索

特点:

1、动态库把对一些库函数的链接载入推迟到程序运行的时期。

2、可以实现进程之间的资源共享。(因此动态库也称为共享库)

3、将一些程序升级变得简单。

4、甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/256335
推荐阅读
相关标签
  

闽ICP备14008679号