【Linux】用gcc生成静态库和动态库

来源:互联网 发布:手机自动录像软件 编辑:程序博客网 时间:2024/05/16 02:09

linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。 
静态库在程序编译时会被连接到目标代码中,目标程序运行时将不再需要该动态库,移植方便,体积较大,但是浪费空间和资源,因为所有相关的对象文件与牵涉到的库被链接合成一个可执行文件。 
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此体积较小,可以实现进程间的资源共享,甚至可以真正做到链接载入完全由程序员在程序代码中控制,另外将一些程序的升级变得简单,但是在程序运行时需要动态库存在.

在Linux中静态库均以.a为文件名后缀,动态库均以.so为文件名后缀

首先先写三个代码,hello.h

#ifndef _HELLO_H#define _HELLO_Hvoid hello(const char* str);#endif

hello.c

#include<stdio.h>void hello(const char * str){printf("hello %s\n",str);}
test.c

#include"hello.h"int main(){hello("sgc");return 0;}
gcc生成静态库
我们用gcc -o 来编译test.c发现不能成功,因为test.c不能把hello.c里内容也一同编译

下面我们将hello.c用gcc -c 生成一个编译文件

ls

生成了一个hello.o文件

下面我们用指令将hello.o生成一个静态库libmyhello.a文件,与库文件中文件命名要统一

指令 ar -r libmyhello.a hello.o

ls后发现系统中多了一个libmyhello.a文件

执行

gcc -o test test.c libmyhello.a

生成test,执行./test

hello sgc

使用 ar -t libmyhello.a查看静态库libmyhello.a中包含的文件

hello.o

gcc生成动态库

执行两条命令

gcc -shared -fPIC -c hello.c
gcc -shared -fPIC -o libmyhello.so hello.o

即可生成一个动态库libmyhello.so

执行命令

gcc -o hello main.c -L. -lmyhello

生成hello文件

./hello后

hello sgc


0 2
原创粉丝点击