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