C++类的动态加载

利用继承关系,定义抽象类,只有纯虚函数构成的接口,然后具体的模块实现放在子类中。

通过extern "C" 解决C++名字修饰问题。得到子类指针。

然后所有函数的名字就遵循了统一约定。

涉及三个c相关的文件和一个makefile

main.cpp 为主程序负责调用so中的类的方法

Module.h 为模块通用接口

module1.cpp 为具体的某个模块的具体实现

Makefile描述编译

main.cpp

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "Module.h"
#include <dlfcn.h>

using namespace std;

int main(int argc,char *argv[])
{
    Module *mp;
    Module *mp1;
    void   *dp;

    typedef Module* (*fun)(void);

    fun pp;

    dp=dlopen("/mnt/c/Users/reed/Desktop/cppdll/libmodule1.so",RTLD_LAZY);

    if (dp==NULL)
    {
        fprintf(stderr,"Error: so load error\n");
        fprintf(stderr,"       %s\n",dlerror());
        exit(0);
    }
    pp=(fun)dlsym(dp,"generate");

    if (pp==NULL)
    {
        fprintf(stderr,"Error: symbol error\n");
        fprintf(stderr,"       %s\n",dlerror());
        exit(0);
    }

    mp=pp();
    mp1=pp();

    mp->run();
    mp1->run();
}

Module.h

#include <iostream>

class Module
{
public:
    virtual void  run()=0;
};

module1.cpp

#include <stdio.h>
#include <stdlib.h>
#include "Module.h"

class module1: public Module
{
public:
    void run()
    {
        printf("I am module1\n");
    }
};

extern "C" {
    Module *generate()
    {
        return new module1();
    }
};

Makefile

all:main so

main:main.cpp so
    g++ $< -o [email protected] -O2 -rdynamic  -ldl
so:module1.cpp
    g++ $< -shared -Wl,-soname,libmodule1.so -o libmodule1.so -O2 -fPIC
时间: 2024-10-05 08:37:15

C++类的动态加载的相关文章

Java的类类型和类的动态加载

有如下简化代码: 准备知识: Student judy = new Student; Class s1 = Student.class; Class s2 = judy.getClass(); Class s3 = null; s3 = Class.forName("com.Student"); 这里s1, s2, s3都是类类型 new创建对象是静态加载类,在编译时刻就需要加载所有的可能用到的类. 动态加载类的例子: 1 // OfficeAble.java2 interface O

[翻译]-Linux上C++类的动态加载

摘要:本文是翻译文章,主要介绍了运行时重载C++类的技术,包括了Linux上的动态加载接口.C++类的动态加载技术点及实现.自动加载技术等.最后给出了两个应用案例及相关的源代码.   关键字:动态加载,C++类,Linux 原文链接:http://porky.linuxjournal.com:8080/LJ/073/3687.html   推荐: (原文)http://www.tldp.org/HOWTO/text/C++-dlopen (翻译)http://hi.baidu.com/clive

[javaSE] 反射-动态加载类

Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载类 在编译的时刻就要去检测该类是否存在,如果不存在,编译失败. //对于这种情况,静态加载不适用,因为我们需要根据输入来确定加载哪个类 package com.tsh.reflect; class ReflectLoadDemo { public static void main(String[]

Java-反射之动态加载类

在Java当中,加载类分为动态加载和静态加载,其中,在编译时刻加载类叫做静态加载类,在运行时刻加载类叫做动态加载类. 产生Class对象的方式中,有一个是Class.forName("类的全称"),这个不仅仅表示类的类类型,而且还表示了动态加载类. 1 package com.example.demo; 2 3 public class Demo { 4 public static void main(String[] args) { 5 if (args[0].equals(&quo

Java反射第二课 动态加载类

在第一节课中我们讲的第三种方法 Class.forName("类的全称"); 不仅表示了类的类类型,还代表了动态加载类 请大家区分编译,运行 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 现在的开发工具比如eclipse把编译过程给隐藏了 下面做一个实验 比如用记事本编写下面的Office.java文件 class Office { public static void main(String[] args) { if(("Word").equals(ar

Java--Reflect(反射)专题2——动态加载类

转载请注明:http://blog.csdn.net/uniquewonderq 首先区分什么是动态加载,什么是静态加载? Class.forName("类的全称");//第三种表达类类型的方式 不仅代表了类的类类型,还代表了动态加载类 要区分编译和运行. 编译时刻加载类是静态加载类.运行时刻加载类是动态加载类. 在编译时刻就需要加载所有的可能使用到的类. 演示代码如下:功能性的类,最好使用动态加载.如,更新,升级,增加新功能等. 首先是一个接口,用于动态加载的.稍候可体验出来. pa

java动态加载类和静态加载类笔记

JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class office { public static void main(String args[]) { if("word".equals(args[0]) { word w=new word(); word.run(); } if("excel".equals(args[0]) {

java动态编译类文件并加载到内存中

如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考笔者的这篇博文-(该博文暂未发布) 所谓动态编译,就是在程序运行时产生java类,并编译成class文件. 一.这里介绍两种动态编译java文件的方式. 第一种:使用Runtime执行javac命令 /** * 编译java类 * 使用Runtime执行javac命令 * @param name 类的全限定包名 不带后缀 例如com.test.Notice 而不要写成com.

Java 反射理解(二)-- 动态加载类

Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 演示 我们以具体的代码来演示什么是动态加载类和静态加载类: 新建:Office.java: class Office { public static void main(String[] args) { // new 创建对象,是静态加载类,在编译时刻就需