灵活使用动态库进行程序开发
2016-02-15 18:47
309 查看
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<error.h>
#include<errno.h>
#include<unistd.h>
#include<strings.h>
#include<stdbool.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<dlfcn.h>
int main(int argc,char **argv)
{
if(argc != 2)
{
perror("Usage <lib.so>");
exit(0);
}
void *handle = dlopen(argv[1],RTLD_NOW);//打开一个动态库,并返回一个库的句柄
if(!handle)
{
fprintf(stderr,"dlopen()%s failed:%s\n",argv[0],strerror(errno));
exit(0);
}
//定义了一个函数指针
char *(*init)(void) = dlsym(handle,"init_something");//根据句柄获取函数名称,或者全局变量
printf("%s",init());
return 0;
}
-------------------------------
vim ts.c
char *init_something(void)
{
return "init ***TS*** ok!!\n";
}
----------------------------------------
vim lcd.c
char *init_something(void)
{
return "init ***lcd*** ok!!\n";
}
---------------------------------------
gcc -o ts.o ts.c -c
gcc -shared -fPIC -o libts.so ts.o
gcc -o lcd.o lcd.c -c
gcc -shared -fPIC -o liblcd.so lcd.o
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
gcc main.c -o main -ldl //dlopen dlsym
./main libts.so
--------------------------------
open
==============
1,可以用来创建普通文件
- open()
s socket()
l link()
p fifo()
b mknod()
c mknod()
d mkdir()
2,可以用来打开普通文件、符号链接、命名管道、块设备 、字符设备
- open()
s socket() (网络接口设备在/dev下没有对应的节点,无法使用oepn)
l open()
p open()
b open()
c open()
d opendir()
动态编译
执行如下代码时,根据指定的动态库来初始化不同的东西
init_something() --> 初始化某些东西
1,动态库liblcd.so中包含:
init_something()
{
printf("init lcd\n");
}
2,动态库libts.so中包含:
init_something()
{
printf("init ts\n");
}
提示:
dlsym()
dlopen()
动态库的静态编译:
======================
gcc main.c -o main -llcd (编译的时候已经指定了动态库,无法改变)
#include<stdio.h>
#include<string.h>
#include<error.h>
#include<errno.h>
#include<unistd.h>
#include<strings.h>
#include<stdbool.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<dlfcn.h>
int main(int argc,char **argv)
{
if(argc != 2)
{
perror("Usage <lib.so>");
exit(0);
}
void *handle = dlopen(argv[1],RTLD_NOW);//打开一个动态库,并返回一个库的句柄
if(!handle)
{
fprintf(stderr,"dlopen()%s failed:%s\n",argv[0],strerror(errno));
exit(0);
}
//定义了一个函数指针
char *(*init)(void) = dlsym(handle,"init_something");//根据句柄获取函数名称,或者全局变量
printf("%s",init());
return 0;
}
-------------------------------
vim ts.c
char *init_something(void)
{
return "init ***TS*** ok!!\n";
}
----------------------------------------
vim lcd.c
char *init_something(void)
{
return "init ***lcd*** ok!!\n";
}
---------------------------------------
gcc -o ts.o ts.c -c
gcc -shared -fPIC -o libts.so ts.o
gcc -o lcd.o lcd.c -c
gcc -shared -fPIC -o liblcd.so lcd.o
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
gcc main.c -o main -ldl //dlopen dlsym
./main libts.so
--------------------------------
open
==============
1,可以用来创建普通文件
- open()
s socket()
l link()
p fifo()
b mknod()
c mknod()
d mkdir()
2,可以用来打开普通文件、符号链接、命名管道、块设备 、字符设备
- open()
s socket() (网络接口设备在/dev下没有对应的节点,无法使用oepn)
l open()
p open()
b open()
c open()
d opendir()
动态编译
执行如下代码时,根据指定的动态库来初始化不同的东西
init_something() --> 初始化某些东西
1,动态库liblcd.so中包含:
init_something()
{
printf("init lcd\n");
}
2,动态库libts.so中包含:
init_something()
{
printf("init ts\n");
}
提示:
dlsym()
dlopen()
动态库的静态编译:
======================
gcc main.c -o main -llcd (编译的时候已经指定了动态库,无法改变)
相关文章推荐
- arch安装mysql
- 记录写博客的初衷
- 开源 一行代码实现多形式多动画的推送小红点WZLBadge(iOS)
- 浅谈按位与,按位或,左移与右移运算符
- sql 删除相同记录,保留一条
- 技巧
- android 拨打电话 源码 两种方式以及区别
- 状态栏的设计和使用
- MTK I2C驱动代码分析
- 快速开发 jQuery 插件的 10 大技巧
- H3C交换系列之Super VLAN
- Be Better:成为进取型的人
- android run/debug configurations时报错Cannot reload AVD list:
- 博文计划
- intellij idea运行Android程序时报错;Unable to locate adb within SDK
- 网络多线程你的理解有多少??
- Java获取汉字的拼音
- 正则表达式判断姓名输入格式是否正确
- nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)
- Android Studio apk 打包流程