Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7896723
  • 博文数量: 701
  • 博客积分: 2150
  • 博客等级: 上尉
  • 技术积分: 13233
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-29 16:28
个人简介

天行健,君子以自强不息!

文章分类

全部博文(701)

文章存档

2019年(2)

2018年(12)

2017年(76)

2016年(120)

2015年(178)

2014年(129)

2013年(123)

2012年(61)

分类: C/C++

2013-06-27 17:59:06

Linux下的动态链接库是.so文件,即:Shared Object,
下面是一个简单的例子说明如何写.so以及程序如何动态载入.so中的函数和对象。

//testso.h:   
#ifndef _TESTSO_H   
#define _TESTSO_H   
extern "C"   
{  
    int myadd(int a, int b);  
    typedef int myadd_t(int, int); // myadd function type   
}  
#endif 
  
//testso.cpp:   
#include "testso.h"   
  
extern "C"  
int myadd(int a, int  b)  
{  
    return a + b;  



编译so:
g++  -shared  -fPIC  -o testso.so testso.cpp

注意,-shared参数和-fPIC参数非常重要:
-shared 告诉gcc要生成的是动态链接库;
-fPIC   告诉gcc生成的生成的代码是非位置依赖的,方面的用于动态链接。


在主程序里调用这个动态链接库:
//main.cpp:   
#include   
#include   
// for dynamic library函数   
#include "testso.h"   
  
void print_usage(void)  
{  
    printf("Usage: main SO_PATH/n");  
}  
  
int main(int argc, char *argv[])  
{  
    if (2 != argc) {  
        print_usage();  
        exit(0);  
    }  
  
    const char *soname = argv[1];  
  
    void *so_handle = dlopen(soname, RTLD_LAZY); // 载入.so文件   
    if (!so_handle) {  
        fprintf(stderr, "Error: load so `%s' failed./n", soname);  
        exit(-1);  
    }  
  
    dlerror(); // 清空错误信息   
    myadd_t *fn = (myadd_t*)dlsym(so_handle, "myadd"); // 载入函数   
    char *err = dlerror();  
    if (NULL != err) {  
        fprintf(stderr, "%s/n", err);  
        exit(-1);  
    }  
  
    printf("myadd 57 + 3 = %d/n", fn(57, 3)); // 调用函数   
  
    dlclose(so_handle); // 关闭so句柄   
    return 0;  
}  
阅读(3956) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~