从 C++.so 调用 python 文件时出现分段错误(核心已转储)

Segmentation Fault (Core Dumped) when calling a python file from C++ .so

我正在尝试使用 swig 生成基于 C++ 的 .SO 文件和包装器。生成此 .SO 是为了从 python(Ubuntu 环境)进行调用。

如果我尝试使用简单的 C++ 代码,它运行良好,但是当我尝试使用 OpenCV 构建时,遇到一些问题。

opencvtest.cpp:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat image;    
    image = imread("/home/swigtest/MyPic.jpg",1);   // Read the file
    namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
    imshow( "Display window", image );                   // Show our image inside it.
    destroyWindow("Display Window"); 
    waitKey(0);                                          // Wait for a keystroke in the window
    return 0;
}

opencvtest.i

 %module opencvtest
         %{
         /* Put header files here or function declarations like below */

         extern int main();

         %}

        extern int main();

因此完成了以下步骤:

  1. opencvtest.cpp - 我写的示例代码。

  2. opencvtest.i - 我写的对应中间文件

  3. 执行命令:swig -c++ -python opencvtest.i

  4. 创建 .o 的 GCC 命令(带包装器):g++ -fpic -c opencvtest.cpp opencvtest_wrap.cxx -I/usr/include/python2.7 -I/usr/local/include -I/usr/local/include/opencv -I/usr/local/include/opencv2

  5. 创建 .so 的命令:g++ -shared opencvtest.o opencvtest_wrap.o -o _opencvtest.so -L/usr/local/lib /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgcodecs.so/usr/local/lib/libopencv_imgproc.so/usr/local/lib/libopencv_ml.so/usr/local/lib/libopencv_objdetect.so/usr/local/lib/libopencv_photo.so/usr/local/lib/libopencv_shape.so/usr/local/lib/libopencv_stitching.so/usr/local/lib/libopencv_superres .so /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videoio.so /usr/local/lib/libopencv_videostab.so

6.Generated.so文件成功

然后尝试测试python,按照步骤操作:

7.python

8.>>> 导入 o​​pencvtest

9.>>> opencvtest.main()

我收到错误:分段错误(核心已转储)

哪位高手可以帮忙解决问题?

刚刚在 opencvtest.cpp 中更改了方法名称 main。

请记住,还要在第 9 步更改方法名称。

它对我来说很好用!

但是我不知道这个方法调用背后的过程运行。

我将方法名称从 main 更改为 one。

在第 9 步中:>>> opencvtest.one()