C中的动态库与静态库
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中的动态库与静态库相关的知识,希望对你有一定的参考价值。
一、介绍
1、静态库
静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码直接复制到程序文件的适当位置,最终生成可执行文件。
使用静态链接库生成的文件通常体积较大,但运行时不再依赖库文件,可以拷贝到别的设备上运行。
在Linux中静态链接库文件的后缀名通常用.a表示;在Windows系统中,静态链接库文件的后缀名为.lib。
2、动态库
动态链接库,又称为共享链接库。和静态链接库不同,采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。
使用动态链接库生成的文件通常体积较小,但运行时依赖库文件。
在Linux中,动态链接库的后缀名通常用.so 表示;在Windows系统中,动态链接库的后缀名为.dll。
二、操作
1、使用静态库
通常情况下GCC在编译过程中默认使用动态链接库,我们可以使用 -static 选项指定使用静态链接库。
2、生成库
静态链接库和动态链接库我们也可以自己制作,只要是不包含 main 函数的文件都可以打包成库文件。可以一个文件打包成一个库文件也可以将多个文件打包成一个库文件。
需要注意,库名格式为:libxxx.a 和 libxxx.so
ar rcs 静态链接库名称 目标文件1 目标文件2 ...
gcc -fpic -shared 源文件名... -o 动态链接库名(出错,可以将 -fpic 换位 -fPIC)
3、使用动态库
在Linux 中,动态库的搜索路径除了默认的搜索路径外(/lib 或者 /usr/lib),还可通过三种方法来指定:
方法一:在配置文件 /etc/ld.so.conf 中指定动态库搜索路径;
ld.so.conf 文件中的内容为 :include ld.so.conf.d/*.conf
所以可以在 ld.so.conf.d 文件夹下创建我们自己的配置文件,并将需要搜索的动态库路径添加进去。
添加完后需要使用 ldconfig 刷新缓存。
方法二:通过环境变量 LD_LIBRARY_PATH 指定动态库搜索路径(临时的,只在当前shell下生效);
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
# 添加依赖搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SHELL_FOLDER/lib/log/linux_x64
方法三:在编译目标代码时指定该程序的动态库搜索路径。
g++ -Wl,-rpath=/usr/local/lib/ -oevh libevent_http.cpp -levent
以上是关于C中的动态库与静态库的主要内容,如果未能解决你的问题,请参考以下文章