当前位置:  技术问答>linux和unix

在linux下如何通过动态链接库调用对象?

    来源: 互联网  发布时间:2015-09-03

    本文导语:  通过下面二个程序我知道如何调用动态链接库中的函数了: //slib.c int func(char* msg) { printf("func be Executed!n"); printf(msg); return 0; } //hello.c #include  #include  void* slib=0; void (*func)(char*); const char* hError; int main(int ar...

通过下面二个程序我知道如何调用动态链接库中的函数了:
//slib.c
int func(char* msg)
{
printf("func be Executed!n");
printf(msg);
return 0;
}


//hello.c
#include 
#include 

void* slib=0;
void (*func)(char*);
const char* hError;

int main(int argc,char* argv[])
{
slib=dlopen("./slib.so",RTLD_LAZY);
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return 1;
}
func=dlsym(slib,"func");
hError=dlerror();
if (hError)
{
printf("dlsym Error!n");
return 1;
}
func("How do you do?n");
dlclose(slib);
hError=dlerror();
if (hError)
{
printf("dlclose Error!n");
return 1;
}
return 0;
}


然后编译:
#gcc -c -fpic slib.c
#gcc -shared -lc -o slib.so slib.o
#gcc -o hello hello.c -ldl

之后执行hello就可调用slib.so里面的func函数

但现在我想在slib.c里放置一个对象,比如

   class A
  {
   public:
       int a;
       void prin() {printf("a=%d",a);}
   };

如果这样的话我如何在hello里定义slib.so里的A对象obj1,并用obj1.a=1,obj1.prin()来输出a的值?
请帮我改一下这二个c文件(或cpp文件),如果编译方法也要改的话再给我编译的方法!
谢谢了!

|
在hello.cpp里定义一个对象的实例(extern),然后把dlsym出来的指针转换成class A*。但更好的办法是hello.cpp里提供一个生成对象的make_A()函数,dlsym()得到这个函数地址,调用这个来产生对象。

|
初学.Mark一下.

    
 
 

您可能感兴趣的文章:

  • Linux添加系统调用时如何调用C语言库函数
  • linux中为什么系统调用比普通函数调用更费时间?
  • 为什么我的BEAN 在WIN2000中调用没有问题,但在LINUX中调用有问题
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 新手:Linux下使用第三方C库(openssl),是调用.so文件还是直接调用.h文件?
  • linux系统调用问题
  • 我如何调用 内核函数 /linux/fs 里面的内核 函数:比如 自己的程序调用 ext3_delete_inode
  • 关于Linux系统调用的问题!
  • 请教在linux中如何动态的增加一个系统调用(模块中)
  • Linux环境下,如何一个驱动中调用另外一个驱动
  • linux:怎么在驱动中调用IIC驱动?
  • linux下在Qt中调用flash播放器
  • 如何达到我这种linux下的系统调用效果
  • window下能否调用linux的静态库(a文件)?
  • Qt下使用Linux系统调用?
  • linux3.0.0.12内核怎么添加系统调用
  • C库函数和linux系统调用区别
  • 请问各位linux开发大虾,linux下有类似VC中depends的工具可以查看文件调用了哪些so文件吗?
  • 1. 请问linux下可以使用“typedef list<对象*> 对象列表名 ”和iterator吗?
  • linux下的编程主旨思想是在面向过程还是面向对象的?谢谢!!
  • Linux:多进程 共享一个对象
  • Automation不能创建对象(LINUX系统)
  • linux下动态库中如何导出对象进行使用
  • linux中标准c如何将XImage对象数据保存到bmp或jpg文件
  • 在linux中, c++编程 有可以保存对象的容器么 类似list
  • 想问 现在主流的Linux 认证有哪几种?它们的适用对象?在广州哪里有好的相关培训中心?
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • linux下,在调用main()函数之前怎样得到命令行参数argc和argv??『比如在main()前面构造全局对象时』
  • linux下,如何在内存指定位置定一个结构体对象。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下通过crond实现自动执行程序
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • 如何通过 Docker 在 Linux 上托管 .NET Core
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • Linux下通过rpm安装软件详细介绍以及如何将软件安装到指定目录
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • linux下能通过ip地址ping通其它机器,通过计算机名ping不通怎么解决?
  • window下能否调用linux的静态库(a文件)? iis7站长之家
  • 书写基于Linux内核的键盘记录器(Writing Linux Kernel Keylogger)中的源码如何编译通过???
  • 我没有linux安装光盘!可不可以通过网络在我的电脑上安装一个linux操作系统!
  • vmware装的linux,通过win2000访问linux的web服务器有问题
  • 98的机子有modem,linux的无,能否通过共享使linux的机子都能上网?
  • codeblocks8.02 for linux,程序可以编译通过,但是通过右键“查找fopen函数的声明”或“实现”,都是提示“没有找到:fopen”,为什么
  • Linux g++编译调用模板函数的类不通过,但是VC2005通过
  • linux能够通过执行脚本添加oracle数据库的用户吗
  • 我刚安装了Linux,但我不知道如何才能通过Moden上网呢?
  • linux如何通过SyGate服务器上网?
  • linux通过局域网上internet
  • 请问通过什么来管理linux服务
  • window下通过ftp执行linux脚本?
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3