GCC背后的故事

一.GCC命令及应用

 1.简介

 GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器。 GCC最初代表“GNU C Compiler”,当时只支持C语言。 后来又扩展能够支持更多编程语言,包括 C++、Fortran 和 Java 等。 因此,GCC也被重新定义为“GNU Compiler Collection”,成为历史上最优秀的编译器, 其执行效率与一般的编译器相比平均效率要高 20%~30%。

2.常用简单编程命令

 首先在Linux下创建test,然后编辑一个Hello.c

 

2.1预处理

写一个简单的代码

然后进行预处理

//将源文件Hello.c文件预处理生成Hello.i

//GCC的选项-E使GCC在进行完预处理后即停止

gcc -E Hello.c -o Hello.i

Hello.i文件可以作为普通文本文件打开进行查看

2.2编译

编译过程就是对预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成的相应汇编语言

gcc -S Hello.i -o Hello.s

//将预处理生成的Hello.i文件编译生成汇编程序Hello.s

//GCC的选项-S使GCC在执行完编译后停止,生成汇编程序

2.3汇编

gcc -c Hello.s -o Hello.o

//将编译生成的Hello.s文件汇编生成目标文件Hello.o

//GCC的选项-c使GCC在执行完汇编后停止,生成目标文件

2.4链接

gcc Hello.c -o Hello

size Hello  //使用size查看大小

ldd Hello //可以看出该可执行文件链接了很多其他动态库

最后进行./Hello输出

其实到最后这所有的步骤就一个命令

gcc Hello.c -o Hello

GCC将直接输出

多个文件同时编译时,可以直接输入以下命令

gcc test1.c test2.c -o test

二.GCC生成静态库和动态库

创建目录test1

#mkdir test1

#cd test1

然后分别编译hello.h hello.c main.c三个程序

将hello.c编译成.o文件

gcc -c hello.c

#ls

由.o文件创建静态库

 在态库文性名的命名规范是以ib 为前缀,紫接着跟静态南名:扩展名为a例如:我们将创建的静态多海myhello.刚静态库文件名就是libmyhello.a.在创建和使用静态库时,需要注意这点。建静态牌师ar命令:在张统提示符下键入以下命令将创建静态库文件libmyhello.a
# ar -crv libmyhello.a hello.o

#ls

在程序中使用静态库

静态库制作完了, 只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明, 然后在用 gcc 命令生成目标文件时指明静态库名, gcc 将会从静态库中将公用函数连接到目标文件中。 注意, gcc 会在静态库名前加上前缀 lib, 然后追加扩展名.a 得到的静态库文件名来查找静态库文件。在程序 3:main.c 中, 我们包含了静态库的头文件 hello.h, 然后在主程序 main 中直接调用公用函数 hello。

利用GCC生成hello执行文件
gcc main.c libmyhello.a -o hello

执行./hello

接下来我们创建动态库文件,将之前的静态文件,执行文件删除。

动态库文件名命名规范和静态库文件名命名规范类似, 也是在动态库名增加前缀 lib, 但其
文件扩展名为.so。 例如: 我们将创建的动态库名为 myhello, 则动态库文件名就是 libmyh
ello.so。 用 gcc 来创建动态库。

gcc -shared -fPIC -o libmyhello.so hello.o

创建成功后,在程序中使用动态库,一样使用跟静态库类似的语句进行。

gcc main.c libmyhello.so -o hello

发现报错了,意思是说没有在共享资源库中找到该文件。在动态库文件的使用中,系统默认会在/usr/lib 和/lib 等目录中查找需要的动态库文件,因此我们需要将我们所创建的动态库文件拷贝到共享库里。我们将文件 libmyhello.so 移动到目录/usr/lib 中。

成功输出了结果。这也说明了动态库是需要在程序运行的的时候被调用。

在实际的应用中,动态库若与静态库同名,则在gcc使用时优先调用动态库。我们接下来验证这一结果。

我们先删除除.c 和.h 外的所有文件, 恢复成我们刚刚编辑完举例程序状态。

再同时创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so。

然后, 我们运行 gcc 命令来使用函数库 myhello 生成目标文件 hello, 并运行程序 hello。

gcc -o hello main.c -L. –lmyhello

三、比较静态库与动态库的占用大小

学习了静态库和动态库的建立过程,我们接下来比较它们所占用的空间大小

我们在第一次作业中的代码补充一个新的子函数x2y,编写程序如下:

还是首先生成两个.o文件,sub.o与subb.o。随后利用已知语法建立静态库

利用size语法 和ls -lh语法可以查看执行文件的占用大小。我们接下来建立动态库

通过比较发现静态库要比动态库要小很多,生成的可执行文件大小也存在较小的差别。

四.总结

静态库是在程序编译时进行使用,而动态库则是在程序运行的时候才会被使用。静态库的占用大小要比动态库小,两者各有各的优势,共同运用于我们平时的编译过程。

参考链接 gcc生成静态库.a和动态库.so_c源文件转换为a静态库-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值