文章目录
🍓前言
学习Linux,少不了在Linux环境下做开发以及编写代码,就不得不得熟悉一下Linux下的这些基础开发工具了
在windows下像vs系列都是集编辑器、编译器、调试器等为一体的IDE环境,而linux下编辑、编译调试代码都需要不同的工具,下面来具体了解一下linux环境的基础开发工具。
⚽vim
vim是linux下多模式的编辑器,支持语法高亮、正则表达式、可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。vim具有程序编辑能力,常用于编写代码。熟悉掌握vim后可以让我们编写代码的效率大大提高,还可以脱离鼠标。我的这篇文章已经详细介绍了vim
linux下的vim
同时vim也是非常强大的,编辑好代码后,只需要添加可执行权限,就可以编译很多语言
⚡gcc/g++
⭐初步了解
在介绍gcc/g++之前,我们先了解一下GCC(GNU Compiler Collection)GUN 编译器集合,最开始gcc就是 GNU C Compiler,也就是一个c编译器,而后来GCC集成了更多语言的编译器,所以现在的gcc/g++从本质上讲只是linux中的驱动程序,根据文件的后缀调对应的GCC编译器。
当然通俗的来说gcc/g++是linux中的编译C/C++的编译器
🍓gcc
gcc是编译c语言的编译器,我们可以通过gcc查看源代码经过预处理、编译、汇编、链接最后形成可执行程序的全过程,我的这篇文章也详细介绍了这些具体的过程
源文件如何一步步到可执行程序
我这里只重点讲解链接阶段
⚡预处理
头文件展开,宏替换,去掉注释 ,条件编译
gcc -E test.c -o test.i #将test.c预处理后的结果输出到test.i文件
⚽编译
词法分析、语法分析、语义分析、符号汇总,最后将c代码优化为中间代码后变为汇编代码
gcc -S test.i -o test.s #编译阶段结束后test.i文件转换为test.s的文件,这里本来不需要-o test.s指定输出,只是为了和上面呼应
⭐汇编
gcc -c test.s #程序编译到汇编阶段后停下来,.s文件转换为.o的二进制目标文件
⚽链接
合并段表,符号表的合并和重定位
gcc test.o -o test#生成可执行程序test,不指定的话默认是a.out
简单来说要将程序运行时需要的目标文件和所依赖的库链接起来形成可执行的文件。
那么什么是库呢?
实际上库就是在多个文件中定义一些常用的函数,然后编译打包行成的二进制目标文件。
比如我们编写的c程序需要包含stdio.h头文件,这个头文件就放着一些头文件的路径以及以及函数的声明等。如果我们调用的printf函数,就需要去库中链接对应的目标文件
编写一个简单的c代码运行后,就可以看到它依赖的第三方库,可以是官方给我们提供的库,也可以是多组协作时同组组员写好的代码打包成库,调用别人写好的代码,这样可以极大程度的提高我们的开发效率。
我的这篇文章就有如何打包成静态库的演示
代码打包成静态库
ldd [可执行程序]#查看可执行程序依赖的第三方库
比如/lib64路径下就放着各种库文件,其中后缀为.a的是静态库(类似windows下的.lib),后缀为.so是动态库(类似windows下的.dll)。
而静态库与动态库的区别就是程序执行时所需要的的文件是在运行时动态加载的,还是在编译时静态加载的,所以链接也分为
动态链接和静态链接
。
静态库:程序在编译时(链接阶段)会将所在静调库中所需要的文件拷贝到目标文件中,因此生成的文件比较大,程序运行时将不再需要该静态库。
动态库:程序编译时并不会将动态库中所需要的的文件拷贝到目标文件中,而是在程序运行时去链接对应的库中的目标文件
🍓动态链接
gcc在编译时默认使用的是动态库,也就是动态链接
当执行到需要调用的库文件就会去库中链接然后返回程序继续执行,不会将目标文件拷贝到我们的程序中
⚽静态链接
由于编译器默认是动态链接所以需要我们指定去链接静态库
-static选项
gcc test.c -o test_static -static
如果显示connot find -lc是因为我们没有安装静调库
sudo yum install glibc-static #安装静态库
我们可以发现同一个程序,静态链接后的文件比动态库链接的文件要大很多,这是因为静态链接会将库中的目标文件直接拷贝到我们的程序中
🍓各自优缺点
动态链接和静态链接各有优缺点,动态链接不需要占用太多空间,但一旦库丢失就无法运行了,而静态链接在哪里都能运行,增强了可移植性,但是非常占用空间
⚡g++
g++就是编译c++的编译器,上面的选项对g++同样适用,当然g++也是可以编译C代码的,因为C++是兼容C的,但是不建议这样
🍓gcc/g++注意事项
c99的语法直接编译会报错,需要在后面加
-std=c99
比如写一个C++11的语法糖范围for,直接编译也会报错,需要加
-std=c++11
⚽gdb
gdb是Linux环境下的调试器,就像在windows环境下的VS2019,打断点调试等,当然gdb调试器是肯定没有vs2019调试起来方便的,但是基本一些指令要了解。
通常我们需要调试肯定不是编译错误,像少了打一个分号,或是调用的函数名写错了,而是一些逻辑错误才需要调试,而说起调试那就必须要是debug版本的才能被调试
这里写了一个0-100的加法和用于测试
readelf -S [可执行程序]#查看可执行程序的段构成
当我们运行后发现可执行程序的段构成是release版的,因为centos中默认的可执行程序是release版本的
所以需要
在该程序的二进制文件中加入了一些dubug信息,程序才能被调试
-g
选项:将可执行程序变为debug版本,能够被调试
gcc test.c -o test -g #这样test就是debug版本了
gdb [可执行程序]#进入调试
l或list [行号]
:查看行号处的代码接着依次往下列,一般每次列10行
l或list [函数]
:列出函数的代码,gdb一般是不会首行显示对应函数或行号的,一般会截取到前面部分
r或run
:运行程序,类似于vs中的ctrl+F5,没有断点的话就直接得到最终结果
b或break [行号n]
:在第n行打断点
break 函数名:在某个函数开头设置断点
s或step
:逐语句
n或next
:逐过程
info b
:查看断点信息
display [变量名]
:查看变量的值
undisplay [编号]
:不显示对应编号的变量
finish
:结束当前函数
continue
:直接跳转的到下一个断点
p [变量]
:查看变量的值
until [行号n]
:跳转到指定行
d n或delete breakpoints n或delete n
:删除序号为n的断点,不带序号n就是删除所有断点,这里n指的是对应的Num
d或delete breakpoints或delete
:删除所有断点
disable breakpoints n或disable n
:禁用序号为n的断点 ,不带序号就是禁用所有断点,如VS2019中禁用断点
enable breakpoints n或enable n
:启用序号为n的断点 ,不带序号n就是启用所有断点
bt
:查看各级函数调用情况及参数,类似于vs2019中查看调用堆栈
set var
:修改变量的值 ,set var i = 10 将i的值改为10
比如i的值本来是100的,我们调试阶段就可以将i变成我们想要的值
q或quit
:退出gdb
以上就是linux下的这些基础开发工具,vim编写代码,gcc/g++编译代码,gdb调试代码,希望我的文章对你有所帮助,欢迎👍点赞 ,📝评论,🌟关注,⭐️收藏
版权归原作者 寄一片海给你 所有, 如有侵权,请联系我们删除。