使用linux共享内存机制完成Qt与应用程序之间的通讯,Qt加载制做本身的共享内存静态库html
首先完成共享内存小程序,源码:linux
shm.h头文件的程序:小程序
#ifndef SHM_H
#define SHM_H
#ifdef __cplusplus
extern "C"{
#endif
typedef struct {
char name[4];
int age;
}people;
people* initshm(void);
void *Create_sharememory(const char *filename,unsigned int SizeCount);
void close_sharememory(void *pshare);
int get_age(people *p);
void set_age(people *p,int age);
#ifdef __cplusplus
}
#endif
#endif
再编写main.cpp函数完成静态库和头文件的调用函数
编译:g++ -o shm main.cpp -L. -lshmui
运行:./shmthis
运行成功。spa
使用Qt程序加载前面制做的静态库.net
shm.cpp源文件的程序:unix
#include
#include
#include
#include
#include
#include
#include
#include "shm.h"
const char *shmfile="/usr/local/sharememory1/huangchao.txt";
people* initshm(void)
{
people *p = (people *)Create_sharememory(shmfile,sizeof(people));
if(p == NULL)
printf("create sharememory failed!\n");
return p;
}
void *Create_sharememory(const char *filename,unsigned int SizeCount)
{
int shm_id,fd;
key_t key;
void *pshare;
const char *path=filename;
if((fd=open(path,O_RDWR|O_CREAT))<0)
{
perror("opne");
return 0;
}
close(fd);
key=ftok(path,10);
if(key==-1)
{
perror("ftok error\n");
return 0;
}
if((SizeCount%2)!=0)
SizeCount++;
shm_id = shmget(key,SizeCount,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error\n");
return 0;
}
pshare = shmat(shm_id,NULL,0);
if(pshare==NULL)
{
return 0;
}
return pshare;
}
void close_sharememory(void *pshare)
{
if(shmdt(pshare)==-1)
perror("detach error");
}
int get_age(people *p)
{
return p->age;
}
void set_age(people *p,int age)
{
p->age=age;
}
把shm.cpp制做成静态库libshm,命令以下code
g++ -c shm.cpp //生成shm.o连接文件
生成静态库,命令以下:
ar cr libshm.a shm.o //生成静态库
main.cpp源文件的程序:
#include
#include
#include
#include
#include
#include
#include
#include "shm.h"
int main()
{
int age;
people *t;
t=initshm();
set_age(t,20);
age = get_age(t);
printf("%d\n",age);
return 0;
}
再编写main.cpp函数完成静态库和头文件的调用
编译:g++ -o shm main.cpp -L. -lshm
生成了shm可执行文件
运行:./shm
运行成功。
使用Qt程序加载前面制做的静态库和头文件,分别把静态库文件libshm.a和头文件shm.h拷贝到本身所建的工程文件夹中,并在工程的源文件中添加头文件#include“shm.h”,以下所示
main.cpp源文件的程序:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "shm.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label->setText("nihao");
int age;
people *t;
t=initshm();
set_age(t,20);
age = get_age(t);
ui->label->setText(QString::number(age));
}
MainWindow::~MainWindow()
{
delete ui;
}
而后在pro工程文件中加入LIBS+=-L./-lshm这样qt就能加载非官方的静态库了。
转载的原地址:http://blog.chinaunix.net/uid-26498888-id-3270926.html
参考资料: