博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux下动态链接库的使用
阅读量:4055 次
发布时间:2019-05-25

本文共 1291 字,大约阅读时间需要 4 分钟。

Linux下的静态链接库,做起来比较容易,只要将目标文件用ar打包就可以,下面写一下动态链接库的制作和使用方法,完全是根据个人理解和经验总结,有不对的地方还请大家指正。

动态链接库的生成:

代码上与写静态链接库没什么区别,主要是在编译时,以两个文件举例:

/*
mylib.h
*/
void
 Print();
/*
mylib.c
*/
#include 
<
stdio.h
>
#include 
"
mylib.h
"
void
 Print()
{
    printf(
"
This is in mylib\n
"
);
}

编译方法如下:

gcc -fpic -shared mylib.c -o mylib.so

此时将生成mylib.so动态链接库文件。

动态链接库在使用时,分为“隐式调用”和“显式调用”两种,如果是隐式调用,则与静态库的使用方法差不多,注意需要包含导出函数的头文件,即mylib.h:

#include 
<
stdio.h
>
#include 
"
mylib.h
"
int
 main()
{
    Print();
}

编译方法:

gcc -o main main.c -L./ mylib.so

注意要加上动态链接库的搜索路径,否则编译器只会到系统路径中去寻找。

显式调用的方式,不必包含mylib.h,但是需要增加几个系统调用:

#include 
<
stdio.h
>
#include 
<
dlfcn.h
>
 
//
 显式加载需要用到的头文件
int
  main()
{
    
void
 
*
pdlHandle 
=
 dlopen(
"
./mylib.so
"
, RTLD_LAZY); 
//
 RTLD_LAZY 延迟加载
    
char
 
*
pszErr 
=
 dlerror();
    
if
!
pdlHandle 
||
 pszErr )
    {
        printf(
"
Load mylib failed!\n
"
)
        
return
 
1
;
    }
    
void
 (
*
Print)() 
=
 dlsym(pdlHandle, 
"
Print
"
); 
//
 定位动态链接库中的函数
    
if
!
Print )
    {
        pszErr 
=
 dlerror();
        printf(
"
Find symbol failed!%s\n
"
, pszErr);
        dlclose(pdlHandle);
        
return
 
1
;
    }
    Print(); 
//
 调用动态链接库中的函数
    dlclose(pdlHandle); 
//
 系统动态链接库引用数减1
    
return
 
0
;
}

可以看到,显式调用的代码看上去要复杂很多,但是却比隐式调用要灵活,我们不必在编译时就确定要加载哪个动态链接库,可以在运行时再确定,甚至重新加载。

看一下显式调用的编译方式:

gcc -ldl -o main main.c

注意要添加-ldl选项,以使用显式调用相关的函数调用。

转自:http://www.cnblogs.com/Xiao_bird/archive/2010/03/01/1675821.html

你可能感兴趣的文章
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
ssh 如何方便的切换到其他节点??
查看>>
JSP中文乱码总结
查看>>
AspectJ下载和安装
查看>>
Java-IO-File类
查看>>
Java-IO-java的IO流
查看>>
Java-IO-字节流和字符流
查看>>
Java-IO-输入/输出流体系
查看>>
Java实现DES加密解密
查看>>
HTML基础
查看>>
Java IO
查看>>
Java NIO
查看>>
Java大数据:Hbase分布式存储入门
查看>>