linux生成.so库,写C++接口

1.写要生成库的头文件和实现文件

IPCz.cpp只需要包含一下头文件即可。

#include"IPCz.h"

IPCz.h中需要包含所有的头文件。
#define IPCZ_H
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include<unistd.h>
#include <sys/stat.h>
#include<stdlib.h>   // 
#include<fcntl.h>    // O_WRONLY
#include<time.h>     // time
#include <sys/msg.h>//消息队列
#include <sys/sem.h>//信号量
#include<sys/shm.h>  // 共享内存
#include<string.h>   // memcpy
#include"IPCinterface.h"
#define SHM_SIZE 1024

同时需要

#ifndef IPCZ_H
#define IPCZ_H

**

#endif /* IPCZ_H */来保证不会重复调用。

并且,此类要继承父类class IPCz :public IPCinterface{

2.写一个接口,.h文件

作为基类,其函数均为纯虚函数。目的为不让调用者看到内部的结构和实现,.h会包括其内部的结构,并声明时继承此父类。


   virtual  void IPCOpen(key_t key, int CreOrGet)=0;

基类不需要include任何。

3.编译为.so库

gcc -fPIC -shared -o libPCz.so  IPCz.cpp

这样就会生成.so库。

4.编译main函数,连接到这个动态库中

 g++  main.cpp -L. -lIPCz -o test
 

注意,需要用G++,用GCC会报错

5.

告诉liux在当前目录寻找动态库/root/.netbeans/remote/192.168.23.232/desktop-vcc2q7a-Windows-x86_64/C/Users/zhao/Desktop/test3

 export LD_LIBRARY_PATH=/root/.netbeans/re...

6.执行 ./test,程序正常运行。

另外。由于我的库文件中的类,内部有一个成员变量,所以在调用的时候,需要创建一个库的对象。

因此使用工厂模式这种方法:

在IPCz。cpp中添加 实例化返回值对象指针
IPCinterface * CREATE(){
    
    IPCz *ipcz=new IPCz();
    return ipcz;
        
};

在接口类中添加该函数的声明

 IPCinterface * CREATE();

调用的时候就可以声明子类的对象指针了。

   IPCinterface * ipcz=CREATE(); 

    ipcz->IPCOpen(key, 0); //服务端创建

猜你喜欢

转载自blog.csdn.net/baidu_39486224/article/details/83069437