灵活使用动态库进行程序开发

#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 (编译的时候已经指定了动态库,无法改变)

原文地址:https://www.cnblogs.com/defen/p/5191171.html