我们要想使用gcc来生成静态库和动态库,首先我们需要明白什么是静态库和动态库。
本质上来说库是一种 可执行代码的二进制形式,可以被操作系统载入内存执行。
linux中的库有两种:
静态库和动态库(动态库又叫共享库)。
两者最大的不同点在于两者代码被载入的时间不同。
静态库:这类库的名字一般是"libxxx.a",利用静态库编译生成的文件比较大,因为在编译链接的时候静态库的代码已经载入可执行程序。
动态库:这类库的名字一般是"libxxx.so",相对静态函库来说动态库的体积相对较小,是因为动态库在可执行程序运行时并才加载到内存中,在编译过程中只是简单的引用。
我们如何知道一个可执行程序依赖哪些库呢?
ldd 可以查看一个可执行程序依赖的共享库。
那么我们如何使用gcc生成静态库和动态库呢?
首先我们先来写几个文件,以供使用。
hello.h
hello.cpp
main.cpp
写好这几个程序后,我们发现hello.cpp中没有main函数。所以不能通过 gcc -o 编译并连接。
现在我们就可以使用静态库和动态库是的程序跑起来。
一,静态链接库:
通过创建静态链接库 libmyhello.a ,使得 main 函数调用 hello 函数时可调用静态链接库。
静态库文件名的命名规范是以 lib 为前缀, 紧接着跟静态库名 ,扩展名为 .a 。例如: 我们将创建的静态库名为 myhello ,则静态 库文件名就是 libmyhello.a 。在创建 和使用静态库时,需要注意这点。 创建静态库用 ar 命令 。
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc 命令生成 目标文件时指明静态库名, gcc 将会从静态库中将公用函数连接到目标文件中。注意, gcc 会在静态库名前加上前缀 lib ,然后追加扩展名 .a 得到的静态库文件名来查找静态库文件。
静态链接库的一个缺点是,如果我们同时运行了许多程序,并且它们使用了同一个库函数,这样在内存中会大量拷贝同一库函数,就会浪费很多珍贵的内存和存储空间。
二,动态链接库:
现在我们来看看怎么样使用动态链接库。
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib ,但其文件扩展名为 .so 。例如:我们将创建的动态库名为 myhello ,则动态库文件名就是 libmyhello.so 。用 g++ 来创建动 态库。
最后没有出来东西,是因为找不到动态库文件 libmyhello.so 。程序在 运行时,会在 /usr/lib 和 /lib 等目录中 查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so 复制到目 录 /usr/lib 中,再试试就出来了。