动态库的创建与调用
动态库的创建:
先创建一个目录用来后续操作:
然后在Dynamic目录下编辑两个文件,calculate.h和calculate.c,此两个文件和静态库用到的文件一样:
编译:
命令:gcc 源文件 -fPIC –shared –o 目标文件
源文件只.c文件,当工程文件数目较少(只有一个)时,便可直接编译
目标文件指最终生成的动态库文件,一般后缀为.so
当工程文件数目较多时,可使用Makefile来编译
Makefile文件:
至此,动态库创建成功!
调用动态库:
设计测试main.c来测试库中的函数
使用命令gcc main.c –L. –lcalculate可直接生成a.out
-L.:-L参数用来指定库的位置,.表示当前路径
-l(小写字母l):表示要链接的库,-l后直接写库名就行,不需要前缀和后缀(比如-lcalculate表示链接的库为libcalculate.so)
使用动态链接库:
在编译程序时,使用动态链接库和静态库是一致的,使用“-l库名”的方式,在生成可执行文件的时候会链接库文件。
命令:
gcc –o maintest main.c –L ./ -lcalcualte
maintest:生成的可执行文件(自己命名)
-L:-L参数用来指定库的位置 此参数之后的./即表示当前路径
-l(小写字母l):表示要链接的库,-l后直接写库名就行,不需要前缀和后缀(比如-lcalculate表示链接的库为libcalculate.so)
*链接动态库的位置必须正确!!
动态调用动态库:
Linux提供dlopen()、dlsym()、dlclose()、dlerror()函数来获取动态链接库的函数。
dlopen()函数的使用示例为:
void *dlopen(const char* filename,int flags);
其中参数flags的取值有三个,RTLD_LAZY、RTLD_NOW和RTLD_GLOBAL,其中RTLD_LAZY表示动态库中存在的未定义的变量,不执行解析,即暂缓决定,等有需要时再解出符号;RTLD_NOW表示动态库中存在的未定义的变量,执行解析,即立即决定,返回前解出所有的未决定的符号;RTLD_GLOBAL使得动态库中的解析的定义变量在随后的其他的链接库中变得可以使用。
dlsym()函数:取函数执行地址,原型为:void *dlsym(void* handle,char* symbol);此函数根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。