经过一些谷歌搜索,我得到了共享库很好的工作。我可以使用dlopen
打开我的模块,并使用dlsym
加载函数。但是,这总是在程序库中运行函数,如何使用库中程序的函数?
我的简化代码:
的main.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int twice(int a){
return a*2;
}
int main(int argc, char ** argv){
char *plugin_name;
void *plugin;
int (*init)();
if(argc<2){
printf("give lib name\n");
return 0;
}
plugin = dlopen (argv[1], RTLD_NOW);
if (!plugin)
{
printf("Cannot load %s: %s\n",argv[1], dlerror ());
return 0;
}
init = dlsym (plugin, "init");
char * result = dlerror ();
if (result)
{
printf("Cannot find init in %s: %s\n", plugin_name, result);
return 0;
}
int res = init();
printf("result: %i\n",res);
return 0;
}
plugin.c
int init()
{
return twice(4);
}
生成文件:
all: main lib
main: main.c
gcc -ldl -o main main.c
lib: plugin.c
gcc -shared -o plugin.so plugin.c
我用它来运行:
./main ./plugin.so
答案 0 :(得分:0)
使用Linux,glibc和GNU ld,您可以将-rdynamic
运行到可执行链接标志。这将使可执行文件中的所有符号对可加载模块可见,就像它是共享库一样。
请注意,这不一定可以移植到其他类Unix系统。