当前位置: 技术问答>linux和unix
显式调用的动态链接库怎么回调?
来源: 互联网 发布时间:2016-03-09
本文导语: 我在写一些动态链接库,这些库文件实现相同的函数名和参数类型,主程序根据配置动态调用不同的库。而主程序调用库函数时,库函数需要调用主程序的函数实现某些功能,比如: /** **Filename: libabc.c **动态链接库...
我在写一些动态链接库,这些库文件实现相同的函数名和参数类型,主程序根据配置动态调用不同的库。而主程序调用库函数时,库函数需要调用主程序的函数实现某些功能,比如:
/**
**Filename: libabc.c
**动态链接库
*/
int StrLen(char *pStr)
{
int iLen = 0;
printMsg(pStr);
...
return iLen;
}
/**
**Filename: main.c
**主程序
*/
void printMsg(char *msg)
{
printf("Message: %sn", msg);
return;
}
int main(int argc, char* argv)
{
char* str = "Hello world!";
int i = StrLen(str);
return 0;
}
在隐式调用中,回调完全没问题,但是因为有不同的库文件实现相同名字的函数,只能显式调用,这时候该如何回调呢?期待高人指点!
/**
**Filename: libabc.c
**动态链接库
*/
int StrLen(char *pStr)
{
int iLen = 0;
printMsg(pStr);
...
return iLen;
}
/**
**Filename: main.c
**主程序
*/
void printMsg(char *msg)
{
printf("Message: %sn", msg);
return;
}
int main(int argc, char* argv)
{
char* str = "Hello world!";
int i = StrLen(str);
return 0;
}
在隐式调用中,回调完全没问题,但是因为有不同的库文件实现相同名字的函数,只能显式调用,这时候该如何回调呢?期待高人指点!
|
看错题目:
加个参数就可以了嘛:
[code=BatchFile]
#! /bin/sh
cc -c -fPIC mlib.c
cc -c -fPIC mlib2.c
cc -shared -o libmlib.so mlib.o
cc -shared -o libmlib2.so mlib2.o
cc -c main.c
cc -o main main.o
./main
[/code]
mymtom@freebsd$ chmod +x build.sh
mymtom@freebsd$ ./build.sh
mlib.c:hello
main.c:main_hello
mlib2.c:hello
main.c:main_hello2
加个参数就可以了嘛:
/*
* file: main.c
* by: mymtom
*/
#include
#include
static void
main_hello(void)
{
printf("%s:%sn", __FILE__, __FUNCTION__);
}
static void
main_hello2(void)
{
printf("%s:%sn", __FILE__, __FUNCTION__);
}
int
main(void)
{
void *h;
void *h2;
void (*f)(void (*pf)(void));
void (*f2)(void (*pf)(void));
h = dlopen("./libmlib.so", 0);
h2 = dlopen("./libmlib2.so", 0);
f = (void(*)(void(*)(void)))dlsym(h, "hello");
f2 = (void(*)(void(*)(void)))dlsym(h2, "hello");
f(main_hello);
f2(main_hello2);
dlclose(h);
dlclose(h2);
}
/*
* file: mlib.c
* by: mymtom
*/
#include
void
hello(void (*pf)(void))
{
printf("%s:%sn", __FILE__, __FUNCTION__);
pf();
}
/*
* file: mlib2.c
* by: mymtom
*/
#include
void
hello(void (*pf)(void))
{
printf("%s:%sn", __FILE__, __FUNCTION__);
pf();
}
[code=BatchFile]
#! /bin/sh
cc -c -fPIC mlib.c
cc -c -fPIC mlib2.c
cc -shared -o libmlib.so mlib.o
cc -shared -o libmlib2.so mlib2.o
cc -c main.c
cc -o main main.o
./main
[/code]
mymtom@freebsd$ chmod +x build.sh
mymtom@freebsd$ ./build.sh
mlib.c:hello
main.c:main_hello
mlib2.c:hello
main.c:main_hello2