gcc编译过程

Tags: 学习笔记

gcc编译过程:

1. GCC编译:

预处理->编译->连接->加载

预处理:处理程序中#开头的内容
编译:程序构建过程, 生成.o文件,gcc 依赖顺序问题(从后向前),如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。
连接:将所有的对象文件和库串联起来,成为可运行程序。静态库已经植入程序,共享库在程序中包含其引用。
加载:程序启动,引用共享库,GCC编译器假定所有的共享库以lib开头,以.so或者.a结尾。

2.gcc 命令

GCC命令详解:

-o
gcc test.c –o test -o用于指定生成程序的名称

-c
-c 选项只是令 GCC 编译器将指定文件处理至汇编阶段,但不执行链接操作

-l(小写的l)

用于指定程序要链接的库,-l后面紧接着(没有空格)就是库名xxxx(去掉lib和.so)

Ps:放在默认路径(/lib ,/usr/lib , /usr/local/lib)的库直接用-i参数就能链接,只需编译时加上 –lxxxx 就能使用libxxxx.so,程序中include libxxxx.so对应的头文件,就可以调用该库的函数。

-L(大写的L)

但是libxxxx.so没有放在默认的三个路径下时,就需要-L指定libxxxx.so的路径,否则程序就会报错(can’t find -lxxxx)。
假设libxxxx.so所在目录为/aa/bb/cc,那么使用格式如下:-L/aa/bb/cc –lxxxx

-shared
用于编译动态库:

-I(大写的i)

头文件不在/usr/include目录下时,用于指定头文件目录

-lm

-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找

3.编译生成的静态库

例,test.c用于编译生成静态库libtest.a,test.h为libtest.a对应的头文件。

第一步:生成test.o目标文件,使用gcc -c test.c -o test.o命令。
  第二步:使用ar将test.o打包成libtest.a静态库,使用ar rcs -o libtest.a test.o命令

使用静态库libtest.a库时,编译选项用 -ltest 指定库,用 -I 指定头文件test.h 的路径, 用-L指定自定静态库 libtest.a 路径。

4.编译生成的动态库

第一步:生成test.o目标文件,使用如下命令。在此处需要添加-fPIC参数,该参数用于生成位置无关代码已工生成动态库使用,使用命令:gcc -c -o test.o -fPIC test.c

第二步:使用-shared参数生成动态库,使用如下命令:gcc -shared -o libmyshare.so test.o,上述两个命令可以连在一起,如下所示:gcc -shared -fPIC -o libmyshare.so test.c
 
 地址无关代码(fPIC)
 
 使用动态库时要指定动态库路径,一般情况/lib 下找, 不过要sudo 权限,
 还有一种方法是修改环境变量:

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:'pwd'
注意pwd 的是反引号,运行里面的命令,并把结果返回给变量pwd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值