GCC生成静态库和动态库
作者:互联网
一、库的简述
库(Library)是由系统提供的一组具有特定功能的函数的集合,是为提高开发效率和运行效率而设计的。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
- 静态库:
静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,程序运行是则不需要静态库的存在,因此利用静态库生成的文件比较大。
命名:lib****.a - 动态库(也叫共享库):
动态库在编译时并没有将该库带进目标代码中,当程序执行到相关函数时才调用该库,因此使用这类库生成的文件会比较小。动态库的改变并不会影响你自己的程序,因此动态库的升级比较方便。除此之外,动态库有一个最显著的特点就是:当多个程序调用同个共享库时,内存中只有一个动态库实例。
命名: lib****.so - 二者区别:
前者是编译连接的,后者是程序运行载入的。
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
二、库的生成
实例使用:
1、创建一个目录
mkdir:用于创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前已有的目录;
ls:用来打印当前目录清单或者打印出指定目录下的文件及文件清单。ls命令在打印文件清单时,还可以查看文件权限、目录信息等等;
2、hello代码
“hello.c”
#include"hello.h"
#include<stdio.h>
void hello(const char *name)
{
printf("hello %s\n",name);
}
“hello.h”
#ifndef HELLO_H_
#define HELLO_H_
void hello(const char *name);
#endif
“main.c”
#include "hello.h"
int main()
{
hello("world!");
return 0;
}
3、gcc编译得到.o文件
cd:进入目录文件;
gedit:进入文本编辑器;
三、创建静态库
1、创建静态库的工具:ar
静态库文件命名规范:以lib作为前缀,是.a文件
ar -crv libmyhello.a hello.o
2、程序中使用静态库
方式一:
gcc -o hello main.c -L. -lmyhello
方式二:
gcc main.c libmyhello.a -o hello
方式三:
先生成main.o,再生成可执行文件libmyhello.a
gcc -c main.c 或
gcc -o hello main.c libmyhello.a
3、验证静态库的特点
在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。
四、创建动态库
1、创建动态库的工具:gcc
动态库文件命名规范:以lib作为前缀,是.so文件
gcc -shared -fPIC -o libmyhello.so hello.o
shared:表示指定生成动态链接库,不可省略;
-fPIC:表示编译为位置独立的代码,不可省略;
2、在程序中执行动态库
gcc -o hello main.c -L. -lmyhello 或
gcc main.c libmyhello.so -o hello
再运行可执行文件hello,会出现错误
解决方法:将libmyhello.so复制到目录/usr/lib中。由于运行时,是在/usr/lib中找库文件的。
mv:将源文件重命名为目标文件, 或将源文件移动至指定目录;
注意:在拷贝文件时,需要是root用户才可执行,在命令前加上sudo,表示允许普通用户使用超级用户权限;
3、静态库与动态库的比较
gcc编译得到.o文件 gcc -c hello.c
创建静态库 ar -crv libmyhello.a hello.o
创建动态库 gcc -shared -fPIC -o libmyhello.so hello.o
使用库生成可执行文件 gcc -o hello main.c -L. -lmyhello
执行可执行文件 ./hello
————————————————————————————
参考资料:
gcc生成静态库.a和动态库.so
标签:gcc,libmyhello,静态,GCC,生成,main,hello,动态 来源: https://blog.csdn.net/Monajim/article/details/120624897