博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux之共享库封装、使用的典型demo
阅读量:4025 次
发布时间:2019-05-24

本文共 3162 字,大约阅读时间需要 10 分钟。

## 目录结构

main.cpp

device.h

lib |  ev | libdevice.so

     |  hw | libdevice.so 

     |  kt | libdevice.so

device |  device.h evoc_device.cpp hw_device.cpp kt_device.cpp

             |   hw_lib |  hw.c hw.h

## 生成静态库(模拟第三方提供的静态库)

#include "hw.h"int calcCpuRate(){        return 90;}int calcTemp(){        return 100;}
#ifndef HW_H#define HW_Hint calcCpuRate();int calcTemp();#endif

gcc  -c hw.c

ar -rc libhw.a hw.o

## 基于静态库生成自己统一接口的共享库

#ifndef DEVICE_H#define DEVICE_H#include 
using namespace std;class Device {public: Device(){} virtual int getTemp(){} virtual int getCpuRate(){} virtual int getHeight(){} virtual string getDiskInfo(){}};#endif
#include "device.h"#include 
class EVoc_Device : public Device {public: EVoc_Device():Device(){ cout << "This is Evoc Device...." << endl; m_temp = 50; m_cpuRate = 10; m_height = 20; m_diskInfo = "well"; } virtual int getTemp(){ return m_temp; } virtual int getCpuRate(){ return m_cpuRate; } virtual int getHeight(){ return m_height; } virtual string getDiskInfo(){ return m_diskInfo; }private: int m_temp; int m_cpuRate; int m_height; string m_diskInfo;};extern "C" Device * create(){ return (new EVoc_Device());}
TARGET  = libdevice.soCC      = gccCXX     = g++LDFLAG  = -shared -fPICxx:        @echo $(DEV)ifeq ($(DEV),EVOC)        $(CXX) $(LDFLAG) -o $(TARGET) evoc_device.cppendififeq ($(DEV),KONTRON)        $(CXX) $(LDFLAG) -o $(TARGET) kontron_device.cppendififeq ($(DEV),HUAWEI)        $(CXX) $(LDFLAG) -o $(TARGET) huawei_device.cpp -I./hw_lib -L./hw_lib -lhwendif
make DEV=EVOC

生成libdevice.so

## 调度共享库

#include "device.h"#include 
#include
#include
#include
#include
using namespace std;#define DEV_PATH_LEN 20int main(int argc,char **argv){ char * pDevType = NULL; if (argc >= 2) pDevType = argv[1]; else pDevType = "hw"; char devPath[DEV_PATH_LEN]; memset(devPath ,0,DEV_PATH_LEN); sprintf(devPath,"./lib/%s/libdevice.so",pDevType); typedef Device * (*Device_t)(); void * dev_handler = dlopen(devPath ,RTLD_LAZY); if (!dev_handler){ cout << "Cannot load library: " << dlerror() << '\n'; return 0; } dlerror(); Device_t create_method = (Device_t)dlsym(dev_handler,"create"); const char * dlsym_error = dlerror(); if (dlsym_error) { cerr << "Cannot load symbol create: " << dlsym_error << '\n'; return 1; } Device * pDevice = create_method(); if (pDevice){ cout << "Temp:\t" << pDevice->getTemp() << endl; cout << "Height:\t" << pDevice->getHeight() << endl; cout << "CpuRate:\t" << pDevice->getCpuRate() << endl; cout << "DiskInfo:\t" << pDevice->getDiskInfo() << endl; } return 0;}

##  

gcc  main.cpp -ldevice

转载地址:http://sjvbi.baihongyu.com/

你可能感兴趣的文章
hibernate中get 与 load 区别
查看>>
JSP文件下载及getOutputStream() has already been的解决
查看>>
Tomcat 6.0 开发配置小结
查看>>
FusionCharts 使用手记
查看>>
Struts,Spring,Hibernate优缺点
查看>>
用Spring更好地处理Struts动作三种整合
查看>>
spring中配置二级缓存
查看>>
Hibernate 查询语句HQL基本语法
查看>>
HIbernate查询
查看>>
小技巧要你命三千之:checkbox radio select 只读效果
查看>>
Android开发(一)Android搭建、HelloWorld
查看>>
Android开发(一)拨打电话程序
查看>>
Android开发(一)发送短信程序
查看>>
Android(二)数据存储和访问 之文件
查看>>
Android(三)数据存储之XML解析技术
查看>>
Android(三) 数据存储之二 SharedPreferences
查看>>
Android(三)数据存储之三SQLite嵌入式数据库
查看>>
Android(四)数据存储之四ContentProvider
查看>>
Android(四)数据存储之四网络
查看>>
Android(五)数据存储之五网络数据交互
查看>>