如何使用gcc编译器

GCC编译的过程大约分为三个过程:预处理,优化与编译,链接;

 

首先看预处理阶段:预处理阶段要将源程序做一些处理,比如宏定义的替换等,最终生成的文件内容是汇编代码,GCC默认不生成这种中间代码的文件,但可以通过命令:

                                                           gcc -S example1.c -o example1.S

在这生成的example1.S就是一个汇编代码文件,注意其后缀不是非加不可的,实际上LINUX对后缀并不敏感,而是通过系统自动识别文件类型,但加上后缀,无疑对我们自己而言更具可读性。

 

优化与编译:

                 优化过程可以分为两类,一是对程序本身的优化,二是对程序能更好的适应特定机器硬件上的优化

                  编译就是对预处理过程生成的汇编代码进一步处理生成电脑能识别的二进制目标文件。

                使用命令:

                                gcc -c example1.c -o example1.o

                如果加入优化选项:

                                  gcc  -O -c example1.c -o example1.o

 

这里example1.o就是一个目标文件,目标文件仍然不是一个可以执行的文件,它要经过链接才能变成可执行文件

                命令:

                              gcc example1.c -o example1

生成的example1就是一个可执行文件,这里并不会产生example1.S 与example1.o的中间文件

 

下面对上述命令的格式做一个统一的说明:

                               gcc [选项]  源文件 [-o] 目标文件 

在这里,[选项]可以说控制的是gcc的执行操作,如果没有[选项],默认是将源文件,执行到生成可执行文件为止,就是预处理,编译与优化,链接一气呵成。

[-o]意味着是要对生成的文件命名,当然不是必须的,但既然生成的文件是自己需要与使用的文件,对其命上自己取的名字是完全有必要的。

 

下面来重点介绍:链接

 

链接分为:静态链接与动态链接

 

所谓静态链接:将所需要的函数库中的目标代码静态添加到可执行文件中

动态链接:将所需函数库的函数名,路径信息等添加到可执行文件中,执行过程中动态加载所需函数库

例如:一个主程序使用了printf函数,在静态链接下,它是将printf 函数代码加入到目标代码中,而动态连接中只是将printf在libc中的位置加入到目标代码中,在执行过程中再动态加载进去。动态链接的好处是,当要加载的函数库内部发生改变时,只需改变其函数库即可,无需改动主程序,也不需重新编译,而如果是静态链接,就得重新编译与外国链接。一般来说实行动态链接的目标文件相比实行静态链接的目标文件来说要小些。

 

下面看两个命令:

                          gcc -s example1.c -o example1 (指定动态链接)

                          gcc example1.c -o example1    (默认静态链接)

 

 

 

生成(函数)库文件:一般可大分为两种函数库文件 静态函数库与动态(共享)函数库

 

创建静态函数库过程:  gcc -c   example1.c -I(所需头文件所在目录) -o example1.o

                                 gcc -c   example2.c -I(所需头文件所在目录) -o example2.o 

 

                                ar -rv libexample.a  example1.o example2.o (创建静态函数库,将这两个目标文件添加至函数库中)

 

                                ar -tv libexample.a       (查看函数库中文件)

 

静态链接函数库:   gcc   example.c -I(所需头文所在目录) -L(所需函数库所在目录) -lexample(指定所需的函数库名) -o example                               

动态链接函数库: gcc   -s example.c -I(所需头文所在目录) -L(所需函数库所在目录) -lexample(指定所需的函数库名) -o example 

 

 

 

创建动态函数库过程:  gcc  -fPIC -c   example1.c -I(所需头文件所在目录) -o example1.o  

                                 gcc  - fPIC -c   example2.c -I(所需头文件所在目录) -o example2.o 

 

                             gcc -shared example1.o example2.o -o libexample.so  (创建动态函数库,将这两个目标文件添加至函数库中)

 

静态链接函数库:      gcc   example.c -I(所需头文所在目录) -L(所需函数库所在目录) -lexample(指定所需的函数库名) -o example 

 

动态链接函数库: gcc   -s example.c -I(所需头文所在目录) -L(所需函数库所在目录) -lexample(指定所需的函数库名) -o example 

 

 

注意要指定LD_LIBRARY_PATH至函数库文件所在目录,才能正常使用函数库

 

 

echo $LD_LIBRARY_PATH (查看)

export LD_LIBRARY_PATH=./ (赋值) 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值