Linux C++动态库so调用实例

test.cpp

#include "stdio.h"

extern "C"
{
        void print();
}

void print(){
        printf("songbai");
}


class Lynn{
        public:
                Lynn();
};


编译:  

g++ test.cpp -fPIC -shared -o libtest.so


test_c.cpp


 #include <stdio.h>
 #include <dlfcn.h>

int main(int argc, char *argv[]){
     void * libm_handle = NULL;
     void (*print)();
     char *errorInfo;
     float result;

     // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
     // 函数返回一个句柄,该句柄用于后续的 API 调用
     libm_handle = dlopen("/home/saxon/work/Unix/libtest.so", RTLD_LAZY);
     // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
     if (!libm_handle){
         // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
         printf("Open Error:%s.\n",dlerror());
         return 0;
     }

     // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
     print = dlsym(libm_handle,"print");
     errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
     if (errorInfo != NULL){
         printf("Dlsym Error:%s.\n",errorInfo);
         return 0;
     }

     // 执行“print”方法
     (*print)();
     printf("result = %f.\n",result);

     // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
     dlclose(libm_handle);

     return 0;
}
~                                                                                                                                             
~  

编译;

g++ test_c.cpp -o test -ldl 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

long12310225

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值