正确编译的代码(没有错误)给出分段错误核心转储



我正在使用cython在c++中使用python函数,它本身调用一个c++函数,一切都编译得很好,但在最后一步出现了错误:Segmentation fault (core dumped)在运行out文件时,我知道很难找到错误,但有人能帮我吗:

#include  <iostream>
#include  "Python.h"
#include  "./plugins/strat_plugin.h" //cython generated header file
int main(int argc, char  *argv[])
{
PyRun_SimpleString("import sysn" "import os"); 
PyRun_SimpleString("sys.path.append( os.path.dirname(os.getcwd()) +'/plugins/')");
int status=PyImport_AppendInittab("start_plugin", &initstrat_plugin);
if(status==-1){
std::cout<<"error in appendinit"<<"n";
return -1;//error
} 
Py_Initialize();
PyObject *module = PyImport_ImportModule("strat_plugin");
if(module==NULL){
PyErr_Print();
Py_Finalize();
std::cout<<"error in import"<<"n";
return -1;//error
}
long long ans=0;
std::list<int> a;
ans=gen_fibonacci(a,1,100); //this is the cython function
std::cout<<"ans: "<<ans;
std::cout<<"n";
}

编译:

g++-8 ./plugins/strat_plugin.c helper.cpp $(python-config --libs)  $(python-config --includes)  $(python-config --cflags)

strat_plugin.pyx文件:

from libcpp.list cimport list
from test import test_sum
cdef public long long gen_fibonacci(list[int] &l,int ind,int  n):
num = 3
t1 = 0 
t2 = 1
nextTerm = 0
i=1
if ind==1:
l.push_back(0)
l.push_back(1)
i=3
if ind==2:
l.push_back(1)
i=2
while i<n:
nextTerm=t1+t2
t1=t2
t2=nextTerm
if num>=ind:
i=i+1
l.push_back(nextTerm)
num=num+1
return test_sum(l)

这与命令cython -2 strat_plugin.pyx生成的头和c文件配合得很好。

strat.h:

#pragma once
#include <iostream>
#include <list>
long long sum(std::list<int> &);

策略.cpp

包括";strat.h">

使用命名空间std;

long long sum(list<int> &l)
{
long long s =0;
for(list<int>::const_iterator i = l.begin(); i != l.end(); i++)
s+= *i ;
return s;
}

strat.pyx:

from libcpp.list cimport list
cdef extern from "strat.h":
long long sum(list[int] &)
def test_sum(list[int] l):
return sum(l)

setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test", ["strat.pyx", "strategy.cpp"], language='c++',)]
setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules)

编译使用:

python3 setup.py build_ext --inplace

更多相关信息:我试着用gdb调试它,得到了这个:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a2569b in PyImport_GetModuleDict () from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0

我真的不明白错误,有人能指出哪里出了问题吗?

删除test_sum(因为我没有代码(,忽略溢出错误(您的python代码超过了while循环中的int范围(,并将PyInit_strat_plugin更改为initstrat_plugin,对我来说效果很好。

最新更新