正确的编译代码(无错误),给出Segmentation故障核心转储。

问题描述 投票:-1回答:1

我是用cython在c++中使用python函数,而c++函数本身又调用了一个c++函数,一切都编译得很好,但在最后一步却出现了错误。Segmentation fault (core dumped) 当运行输出文件时,我知道要找到错误是很困难的,但有人能帮帮我吗?

#include  <iostream>
#include  "Python.h"
#include  "./plugins/strat_plugin.h" //cython generated header file
int main(int argc, char  *argv[])
{
    PyRun_SimpleString("import sys\n" "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)

这个命令可以很好地编译,产生头和c文件。cython -2 strat_plugin.pyx 产生头和c文件

strat.h。

#pragma once

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

strat.h: strategy.cpp

包括 "strat.h"

使用namespace 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

我并没有得到错误的信息 谁能告诉我是怎么回事?

python c++ c cython
1个回答
1
投票

移除 test_sum (因为我没有它的代码),忽略溢出错误(你的python代码超过了一个int在 while 循环),并改变 PyInit_strat_plugininitstrat_plugin它的工作原理对我来说很好。

© www.soinside.com 2019 - 2024. All rights reserved.