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); //服务端创建