Linux下gcc使用经验总结

1.gcc的常用参数:

I(大写i)参数:添加头文件目录到索引目录;例如:-I /usr/local/include/

L参数:添加链接库目录到索引目录;例如:-L /usr/local/lib/

l(小写L):表示编译时添加链接库文件;例如:-ltest(参数与内容中间没空格)代表着连接(库名为test)链接库文件,库名和实际文件名是不同的,库名是文件名去掉开头的lib和结尾的.a或.so后的名字,比如文件名为libmy.a的链接库的库名是my

2.gcc的机制:

链接顺序:gcc的链接顺序是从右向左来解析链接参数的,也就是说gcc如果链接多个文件的时候,后从右向左依次链接,所以先被连接的文件要写到最右边,也就是命令的最后。
gcc链接库目录:gcc把/usr/lib和/usr/lib64作为默认的库索引目录,这是可以控制的,操作方式是这样的----1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径 2.运行ldconfig,该命令会重建/etc/ld.so.cache文件

3.静态库问题:

生成静态库:
静态库只是一堆object对象的集合,使用ar命令可以将.o文件打包成.a静态库。
假设gcc已经生成了a.o, b.o, c.o,使用下面的命令即可生成libmylib.a
#ar rcs libmylib.a a.o b.o c.o

4.动态库问题:

生成动态库:
动态库的生成由gcc直接生成。
假设a.c, b.c两个文件,通过下面的命令可生成libmylib.so
#gcc -shared -o libmylib.so a.c b.c

5.gcc的使用问题:

-static选项时候提示cannot find -lc:
原因分析:
gcc编译时候调用了libc.so的链接库文件,如果加入了-static参数,这时候gcc寻找的就是libc.a文件了,如果目录中没有,则出现cannot find -lc;正常情况下用yum安装gcc是不安装静态库的,所以有此错误。
解决方案:
安装gcc对应的静态库,即:yum install glibc-static

在-static选项下使用-lm也就是math库时候报错:undefined reference to `sqrt`:
原因分析:
因为编译选项中有-static, 所以 -lm 指的是libm.a

这就涉及到符号空穴的实现问题。
Sam猜测:因为编译器从左向右读取文件, 当读到-lm时,因为是静态的,但此时还不知道该把哪个符号抽出来。所以只好往后继续处理,等在main.o中发现
*UND* 00000000 sqrt, 也就是这个符号需要填入时,后面的文件却没有这个符号的实现。所以就报错了。

但如果去掉 -static. 则编译器编译出的test中此符号还是未定义。但会在运行时从libm.so中将符号找到。
解决方案:
既然编译器只会向后找符号,那很简单,把-lm放后面就行了。
gcc -o test -static test.o -lm
编译成功。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。