Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux系统 > » 正文

Linux下GCC创建、链接静态库实例

来源: 未知 分享至:

静态库和动态库的区别:

静态库(xxx.a):GCC在编译生成可执行程序时,从静态库中提取必要的目标文件,在可执行程序编译成功时,同时包含了目标文件,这样带来的缺点是当多个可执行程序同时调用一个库文件时,加载到内存中的库文件可能存在重复,这是对内存的一个极大的浪费,但是由于编译时已经把库文件中需要的目标程序拷贝过来,因此可执行程序初次加载的速度是比动态库略显快些。

动态库(xxxx.so)GCC在编译生成执行程序时,拷贝到可执行程序中的仅仅是一个库的地址(可以理解为指针),这样当多个可执行程序利用同一个动态库时,加载到内存中的库文件仅仅需要一份就可以了,这样大大的保护的珍贵的内存资源,略为不足的是当执行可执行文件时,需要通过地址寻找动态库文件,这个过程耗费了些许的时间。

 

 

下边是一个静态库创建使用的实例:

 

[root@localhost ~]# cd /gcc/ar/

[root@localhost ar]# mkdir include

[root@localhost ar]# mkdir lib

建立头文件:mylib.h

[root@localhost ar]# vim include/mylib.h  

 

int func1(int x,int y);

 

void func2(int x);

建立以下的源文件:main.cfunc1.cfunc2.c

[root@localhost ar]# vim main.c

 

#include <stdio.h>

#include "mylib.h"

 

int main(void)

{

        int i;

        i = func1(1,2);

        func2(i);

        return 0;

}

~  

[root@localhost ar]# vim func1.c

 

#include "mylib.h"

 

int func1(int x,int y)

{

        return(x+y);

}

~    

[root@localhost ar]# vim func2.c

 

#include <stdio.h>

#include "mylib.h"

 

void func2(int x)

{

        printf("The result is %d\n",x);

}

~

生成目标文件  

[root@localhost ar]# gcc -Wall -O -c func1.c –Linclude

[root@localhost ar]# gcc -Wall -O -c func2.c –Iinclude

[root@localhost ar]# gcc -Wall -O -c main.c –Iinclude

生成库文件

[root@localhost ar]#cd lib/

[root@localhost lib]# ar cr libethnicity.a  ../func1.o ../func2.o

[root@localhost lib]# ar t libethnicity.a

func1.o

func2.o

编译生成可执行文件(这里采用三种方式)

1)采用-L library -I include方式

[root@localhost ar]# gcc -Wall -O main.o -Llib -lethnicity -o wanyan

[root@localhost ar]# ./wanyan

The result is 3

2)采用添加到系统库的方式

[root@localhost ar]# cp lib/libethnicity.a  /usr/lib

[root@localhost ar]# gcc -Wall -O main.o -lethnicity -o ethnicitybeta

[root@localhost ar]# ./ethnicitybeta

The result is 3

3)修改本地.bash_profile的方式

[root@localhost ar]# export LIBRARY_PATH=/gcc/ar/lib:$LIBRARY_PATH

[root@localhost ar]# gcc -Wall -O main.o -lethnicity -o laji

[root@localhost ar]# ./laji

The result is 3

实验结束

 

总结:这个小实验是对小布老师视频学习的一个笔记,之所以采用的代码十分的简单,是因为这个实验是为了了解静态库建立使用的远离,最后列出了三种GCC编译时加载静态库的方法,十分的实用。


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史