linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。 静态库在程序编译时会被连接到目标代码中,目标程序运行时将不再需要该动态库,移植方便,体积较大,但是浪费空间和资源,因为所有相关的对象文件与牵涉到的库被链接合成一个可执行文件。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此体积较小,可以实现进程间的资源共享,甚至可以真正做到链接载入完全由程序员在程序代码中控制,另外将一些程序的升级变得简单,但是在程序运行时需要动态库存在.
在Linux中静态库均以.a为文件名后缀,动态库均以.so为文件名后缀
首先先写三个代码,hello.h
#ifndef _HELLO_H#define _HELLO_Hvoid hello(const char* str);#endifhello.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.cgcc -shared -fPIC -o libmyhello.so hello.o
即可生成一个动态库libmyhello.so
执行命令
gcc -o hello main.c -L. -lmyhello
生成hello文件
./hello后
hello sgc
新闻热点
疑难解答