C代码中共享库编程和使用共享库(简单例子)

2009-05-13 08:00:01来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

共享库里面的代码都是“位置独立代码”,所有的内部寻址都通过全局偏移表完成。
使用共享库,必须在运行的时候能够找到共享库的位置。使用共享库的代码利用名字来定位共享库。
一个我学习的例子,出自《GCC技术参考大全》
1、生成共享库
代码:
/* sayhello.c */
#includestdio.h>
void sayhello()
{
    printf("Hello from a loaded function.\n");
}
/* sayhello.c */
#includestdio.h>
void sayhello()
{
    printf("Hello from a loaded function.\n");
}
使用下面的命令把这两个函数编译成位置独立代码,并用他们创建共享库 libsayfn.so
$ gcc -fpic -shared sayhello.c saysomething.c -o libsayfn.so
-fpic  生成可用于共享库的位置独立代码(PIC)
-shared  连接程序生成共享目标代码
-o      指定输出的名称
2、使用共享库
/* say.c */
#includedlfcn.h>
#includestdio.h>
int main(int argc,char *argv[])
{
    void *handle;
    char *error;
    void (*sayhello)(void);
    void (*saysomething)(char *);
    handle = dlopen("libsayfn.so",RTLD_LAZY);
    if(error = dlerror()) {
        printf("%s\n",error);
        exit(1);
        }
    sayhello = dlsym(handle,"sayhello");
    if(error = dlerror()) {
        printf("%s\n",error);
        exit(1);
    }
    saysomething = dlsym(handle,"saysomething");
    if(error = dlerror()) {
        printf("%s\n",error);
        exit(1);
    }
    sayhello();
    saysomething("This is something");
    dlclose(handle);
   
    return 0;
}
这个程序包含dlfcn.h头文件,里面有dlopen(),dlsym(),dlerror(),dlclose()的定义。在编译时也需要使用dl库。具体的位置是
因为这个程序调用的是和代码同目录下的共享库,不在系统默认的库搜索路径,所以在编译时要特别指出。
$ gcc say.c -L. -Ldl -o say


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12258/showart_291357.html

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:使用kdesvn同步kde代码

下一篇:一些KDE编程的资源