||
时常编写一些C++功能程序,然而测试或者组合它们却是件费力的事。利用python这种被称为“万能胶水”的语言工具可以很好的简化测试过程。下文将简要的列出测试方法的一个范例。
建立动态库所需的头文件:S_fifo.h 内容如下
#include<malloc.h>
template<class T> class s_fifo
{
public:
T* data;
s_fifo(int k)
{
i= k;
data= (T *)malloc(i*sizeof((T)0));
start= 0;
end= i - 1;
sum= 0;
}
~s_fifo()
{
free(data);
};
int sum;
int put(T*);
int get(T*);
int put_s(T*, int);
int get_s(T*, int);
void clear();
private:
int start;
int end;
int i;
};
extern"C"{
int ad(int, int);
}
extern"C"{
void* creat_s_fifo_int(int);
}
extern"C"{
void delete_s_fifo_int(void*);
}
extern"C"{
int s_fifo_put(void*,int*);
}
extern"C"{
int s_fifo_get(void*,int*);
}
extern"C"{
int s_fifo_puts(void*,int*,int);
}
extern"C"{
int s_fifo_gets(void*,int*,int);
}
extern"C"{
void s_fifo_clear(void*);
}
这是一个管道类,并引出几个接口函数。
它的cpp文件: s_fifo.cpp
G++测试文件:test.cpp
Makefile文件如下:
CC=g++
PROGS=t
p=$(shell pwd)
t:test.cpp s_fifo.so
$(CC)-o test test.cpp -ldl
s_fifo.so:s_fifo.cpp s_fifo.h
$(CC)-fpic -shared -o s_fifo.so s_fifo.cpp s_fifo.h
echo$@
clean:
rm-rf *.o
编译生成动态库s_fifo.so,以及连接到测试程序,执行:
[root@localhost fifo]# make
g++ -fpic -shared -o s_fifo.so s_fifo.cpps_fifo.h
echo s_fifo.so
s_fifo.so
g++ -o test test.cpp -ldl
[root@localhost fifo]# ls
Makefile s_fifo.cpp s_fifo.h s_fifo.so test.cpp TFIFO.py test
[root@localhost fifo]# ./test
ad:77
......0 160539576 re:=10
0 1 2 5 10 17 0 0 0 0 0 0 0 0 0 0[root@localhost fifo]#
每次测试或者组合其它功能模块都要去编写一次main去调用获取动态库是繁琐和低效的。
下面用python来测试:
建立python文件TFIFO.py如下:
#!/usr/bin/python
import os
import re
import ctypes
handle=ctypes.CDLL('./s_fifo.so')
print type(handle)
print'************************************************************'
print handle.ad(12,34)
fifo=handle.creat_s_fifo_int(100)
print type(fifo)
L="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
re = handle.s_fifo_puts(fifo,L,5)
print re
U=16*'^__^'
print U
re = handle.s_fifo_gets(fifo,U,8)
print re
print (U)
re = handle.delete_s_fifo_int(fifo)
保存并执行:
[root@localhost fifo]# ./TFIFO.py
<class 'ctypes.CDLL'>
************************************************************
46
......0<type 'int'>
<type 'list'>
5
^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^
5
1234567890abcdefghij^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^^__^
[root@localhost fifo]#
其中U是str格式,而我们的类模板生成int型fifo类的应用,所以是4个char一位,也就是
也就是5×4=20 bytes
在动态库文件接口用extern”C”扩展,python调用。
库的接口函数编写用void *指针转换。
Linux下调用.so添加#include<dlfcn.h> 该头文件需要静态库lib:-ldl。
Python版本2.5,动态库需加载ctypes模块。
class CDLL(__builtin__.object)
| An instance of this classrepresents a loaded dll/shared
| library, exporting functionsusing the standard C calling
| convention (named 'cdecl' onWindows).
|
| The exported functions can beaccessed as attributes, or by
| indexing with the functionname. Examples:
|
| <obj>.qsort ->callable object
| <obj>['qsort'] ->callable object
|
| Calling the functions releasesthe Python GIL during the call and
| reaquires it afterwards.
……
注:本文只是个人常用的方法,而不是一个标准.
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 18:58
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社