加载模块时出错./exp.so未定义符号

时间:2016-03-26 23:05:37

标签: python swig

我试图将一个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手册说它不是必需的。

1 个答案:

答案 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)