当前位置:   article > 正文

对于静态库的总结!!!(linux)_两个静态库用不同定义的结构体

两个静态库用不同定义的结构体

对于静态库 :(linux)

首先如何建立一个静态库,静态库有什么作用,静态库有什么优点和缺点,如何使用。


1.如何建立一个静态库:

在终端中输入:

ar -r lib库名.a <文件.o> <文件.o>......

注意 : 

在这里首先要注意一下

libmyku.a  这是一个静态库

myku     这是一个库名


扩充 建立静态库 :

ar 参数

-t lib库名 .a 显示库中文件名(目标文件)

-x lib库名.a分解库,把目标文件全部显示出来,库不会消失,如果目标文件相同会被后者覆盖。

-q    lib库名.a在静态库末尾追加目标文件。

-r  lib库名.a创建库,如果存在,覆盖

-d lib库名.a          目标文件.o从库中删除目标文件





作为一个库 首先必须在前面加上 lib 这三个字母,(非常重要)。

但是作为一个静态库 ,你在这个文件的最后要加上 .a 这个扩展名

这些都是必须遵守的。


上面的   <文件.o> 是机器码,可以说成是计算机语言,但是这样的语言我们是看不懂的,只有计算机能看懂

简单说一下如何得到这样文件的。

gcc -E 文件.c -o    文件.i    对文件进行预处理

gcc  -S文件.i ->文件.s 生成汇编文件

gcc  -c文件.s ->文件.o 生成计算机语言

gcc  文件.o->  a.out生成能运行的文件。


其实如果想直接生成 .o 文件也可以不用这样,直接使用

gcc  -c 文件.c         -> 文件.o

这样就可以直接生成 文件.o 



2.静态库有什么用 ?

其实这个问题是最关键的,如果他不能用,我们就白忙活了。

同学,你是不是因为文件过多,同时编译的时候而困扰。

其实静态库就是干这样的事情的,

在你写的.c 文件中(我学习的是c语言),可能有你经常使用的函数,或者是功能相同的函数,或者是

结构体定义,你可以把这些函数或者是结构体都进行打包,也就是进行静态库创建,以后你在想使用这些函数

或者是结构体的时候就不用再次定义了,直接调用就可以了。


3.创建一个静态库有什么优点和缺点?

首先在这里要区分一下静态库和共享库(动态库) 这两个是两个对立的库,都可以实现上面的功能,但是

这两个库最后执行的方法是不一样的,在使用静态库生成 a.out 的时候,他会把静态库中的所有代码都放入

a.out中,而且在编译的时候就把他把静态库中所有的代码放入a.out中,无论这个代码对于最后的执行有没有用

这样做就会花费大量空间。对于共享库就不一样了,他是在代码运行的时候插入代码,而且是只插入有关

的代码,其他的不需要,在运行的时候,动态库花费的时间多,但是占用空间小。


总结一下 :

静态库 : 运行时间少,空间大,运行时没有关联

动态库 : 运行时间长,空间小,运行时有关联


察看库中内容和库的关联性:

nm lib库名.a 

显示库中函数内容 :

1.函数没有在库中定义,需要其他库进行支持。(T)

2.函数在库中定义了,不需要其他库进行支持(U)

3.虽然被定义了,但是会被其他库中相同函数名给覆盖(W)



4.如何使用静态库?

在这里我要说明三种方法 :(其实我就会三种,多了也不会)

1.gcc main.o lib库名.a

这种方法简单粗暴,这样不好不好,不推荐使用。

2.gcc main.o -l库名 -L<库路径>

注意在这里就不需要lib 和 .a ,只需要库名,库路径是相对路径和绝对路径都可以。

这种方法推荐使用

3. export LIBRARY_PATH=$LIBRARY_PATH:库路径

gcc main.o -l库名

这种方法首先要进行环境变量的设置,如果使用这样的方法只能在本次终端中使用,如果

你重新打开了一个新的终端,这个环境变量就需要重新设置,如果不想这样一直设置,就

需要更改~/.bashrc 文件,在文件最后加上那句话,之后重新启动电脑,或者

source ~/.bashrc

























声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/976335
推荐阅读
相关标签
  

闽ICP备14008679号