首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

动态装载库,该如何处理

2013-01-22 
动态装载库各位大师我有一个主程序test,一个自定义库libjim.so.1.0.0,我想用test 动态加载libjim.so.1.0,

动态装载库
各位大师我有一个主程序test,一个自定义库libjim.so.1.0.0,我想用test 动态加载libjim.so.1.0,这个库怎样使用test中的变量符号呢?
#include<stdio.h>
#include<dlfcn.h>
void *handle;
void (*func)(void);
char *info;
char str[] = "hello str in main.c";
int main()
{
    handle = dlopen("/home/user/work/study/libjim.so.1.0.0", RTLD_NOW);
    if((info = dlerror()) == NULL)
    {
        func = dlsym(handle, "jim");
        if((info = dlerror()) == NULL) func();
        dlclose(handle);
        return 0;
    }
    puts(info);
    return -1;
}
int test()
{
    puts("test from main");
}
gcc -o test test.c -ldl -export-dynamic



#include<stdio.h>
extern void test(void);
extern char *str;
jim(void)
{
    puts("jim");
    test();
    //puts(str);
}
gcc -shared -fPIC -Wl,-soname,libjim.so.1 -o libjim.so.1.0.0 jim.c



jim.c中被注释掉的puts(str);不能执行成功。
主程序中的全局函数能够被导出,全局变量呢?能否被导出呢?
[解决办法]
全局变量是无法导出的, 如果你真的要取全局变量的值, 你可以在封装个函数, 通过函数来返回全局变量的值, 只能这样了。
[解决办法]
如果全局变量也可以导出的话, 那就失去了模块的封装性, 我开发一个库难道还要考虑我的变量命名是不是会和别人的变量重名, 那还怎么搞啊。。。。

热点排行