Linux基础工具——gcc/g++以及动静态库

在这里插入图片描述

gcc/g++

gcc 只能用于编译C g++可以用于编译C\C++
两个编译器的指令完全相同,学一个即可,我们以gcc为例
gcc mycode.c编译文件
编译后会默认形成的可执行程序是a.out
linux想要运行任何程序,都需要先找到程序
./定位到当前目录,./a.out 就可以运行该程序
在这里插入图片描述

常用选项

接下来具体介绍gcc的一些选项
-o 输出文件名 -o选项后面紧跟着输出文件名
gcc mycode.c -o mycode.exe 形成一个mycode.exe文件
-E 告诉gcc,从现在开始,进行程序的翻译,将预处理工作做完就停下来,不要往后走了 后面紧跟需要编译的文件源
gcc -E mycode.c 如果后面不跟着-o文件名那么就是将结果打印到显示器上
gcc -E mycode.c -o mycode.i .c生成.i
gcc -S mycode.i -o mycode.s 从.i文件开始翻译,将编译工作做完就停下来,.i生成.s
gcc -c mycode.s -o mycode.o 从.s开始翻译,将转换成二进制的工作做完就停下来
mycode.o —— 可重定位目标二进制文件,简称目标文件 —— .o 在windows下就是.obj文件 不能独立执行,虽然已经是二进制了,需要经过链接,才能执行
gcc mycode.o -o mycode 将可重定位目标二进制文件和库进行链接,形成可执行程序(这里是将多个.c .cpp以及库文件链接在一起)
记忆:键盘上的ESc也就是对应了:预处理 、汇编 、编译
对应选项执行后生成的文件后缀: .i .s .o

-E -S -c 决定编译工作做到哪一步结束,不会决定编译工作是从哪里开始的,也就是说,我可以让.c文件使用-c选项,直接得到.o的目标二进制文件
在这里插入图片描述
以上就是gcc的一些基本操作,能够满足大部分使用场景,以后我们会讲到make/makefile,自动化工具,也会再次用到gcc、g++工具,届时再说

我们做工程型的文件时,.h文件中放define、函数声明,一个.c中放我们的函数实现,另一个.c调用函数完成整体代码逻辑,那如果我们写了大量针对不同使用场景的类、函数,放在了多个.c文件中,以供后人调用,我们可以把这些.c文件通过gcc等编译器工具编译成.o后缀的文件
然后用库管理工具(比如Visual Studio的lib指令工具)将这些.o文件进行链接,此时就会生成.lib文件,这个.lib文件,就是我们的库的一种后缀(在Linux下.a .so是库的后缀,Windows下是.lib .dll后缀),比较著名的库有:c的标准库,c++中的stl库等

于后人而言,我们在编写代码时在 .o 文件生成.exe文件时,会将这些库和我们的代码进行链接,使得我们能够正常使用这些库,这里就涉及到了两种链接方式:

动态链接

可执行程序的执行过程就是按照代码的行数一行行向下执行,当遇到了库函数调用,就跳转到动态库中执行函数,而如何跳转?这就是编译器的工作,并且,所有程序员在调用库函数时,都是去动态库中执行,因此这个动态库也叫共享库,共享库在承载能力内是只需要一个的,动态库不能缺失,一旦对应的动态库缺失了,可能会导致很多程序都无法进行正常的运行

ldd指令,可以查看可执行程序所依赖的动态库
Linux中动态库后缀是.so windows中动态库后缀是.dll
在这里插入图片描述
这三个就是processbar需要的动态库

这些指令也是用C语言(大部分) C++写的
也就是说,如果我把这些C库删掉了,这些用了C库的指令也无法使用了,那么也就意味着该计算机上Linux无法正常使用了

静态链接

在编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不再依赖静态库,该可执行程序已经完备。
Linux下静态库后缀为 .a Windows中静态库后缀为.lib

-static选项

在Linux中,编译形成可执行程序,默认采用的就是动态链接,也就需要提供动态库

gcc的-static选项就是让编译器采用静态链接的方式,也就需要系统提供静态库(Linux默认是没有装静态库的,需要自行安装 centos7 yum安装C/C++静态库,在百度上找找 sudo yum install -y glibc-static sudo yum install -y libstdc+±static)
在这里插入图片描述

在这里插入图片描述
大家可以注意到静态链接的可执行文件的大小和动态链接可执行文件的大小差异,100倍之大,那么如果一个企业级程序,用静态库是1G,那么用动态库就是100G,因此其实我们一般不会使用静态库,需要什么去动态库调用什么,这样会很节省空间
当然,此时如果用ldd来查看 mytest_static可执行程序的动态库就会有提示:
在这里插入图片描述
如果我们没有动态库,只有静态库,并且gcc能找到该静态库,不使用-static还能够正常链接吗?可以链接到该静态库,因为gcc默认优先动态链接,如果没有动态链接,就会去寻找静态链接 —— static的本质:改变寻找库的优先级
由于我们的库有很多,有些是动态链接有些是静态链接,因此我们的库不一定是纯的全部动态链接,或者全部是静态链接,有可能是混合的,如果加了-static 就会将所有链接要求变成静态链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失去梦想的小草

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值