我试图将一个c代码包装成可以从python中调用。
代码:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "math.h"
int givernd(int krp1,int krp2)
{
int trye;
int inp1=krp1;
int inp2=krp2;
time_t broke;
if(inp1 > inp2)
{ printf("error");
exit(0);
}
if((inp1)=(inp2-1))
{ printf("error");
exit(0);
}
srand(time(&broke));
trye=rand()%krp2;
if(trye<krp1)
{
return(trye+krp1+1);
}
if(trye==krp1)
{
return(trye+1);
}
return(trye);
}
.i文件:
/* now1.i */
%module now1
%{
/* Put header files here or function declarations like below */
extern int givernd(int krp1,int krp2);
%}
extern int givernd(int krp1,int krp2);
试验1:
$ swig -python now1.i
$ gcc -c -fPIC now1_wrap.c -I/usr/include/python2.7
$ gcc -shared -fpic now1_wrap.o -o now1_wrap.so -lc
$ python
Python 2.7.3 (default, Jun 22 2015, 19:43:34)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import now1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initnow1)
试验2:
$ swig -python now1.i
$ gcc -fpic -I/usr/include/python2.7 -c now1_wrap.c
$ gcc -shared now1_wrap.o -o now1.so
$ python
Python 2.7.3 (default, Jun 22 2015, 19:43:34)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import now1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: ./now1.so: undefined symbol: givernd
>>>
我做错了什么?
我想知道是否需要添加一个测试功能,它将作为重复主要的起点,但swig手册说它不是必需的。
答案 0 :(得分:1)
你还没有说过第一个文件,包含你的givernd
定义的文件被调用,但假设它被称为givernd.c你需要编译和链接它以及那个包装器SWIG生成,例如:
$ swig -python now1.i
$ gcc -c -fPIC now1_wrap.c -I/usr/include/python2.7 -o now1_wrap.o
$ gcc -c -fPIC givernd.c -I/usr/include/python2.7 -o givernd.o
$ gcc -shared -fpic now1_wrap.o givernd.o -o now1_wrap.so -lc
(注意:您对gcc的调用也缺少-o)