#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
",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!!
";
}
----------------------------------------
vim lcd.c
char *init_something(void)
{
return "init ***lcd*** ok!!
";
}
---------------------------------------
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
");
}
2,动态库libts.so中包含:
init_something()
{
printf("init ts
");
}
提示:
dlsym()
dlopen()
动态库的静态编译:
======================
gcc main.c -o main -llcd (编译的时候已经指定了动态库,无法改变)