【问题标题】:Segmentation Fault (Core Dumped) when calling a python file from C++ .so从 C++ .so 调用 python 文件时出现分段错误(核心转储)
【发布时间】:2015-04-14 15:53:41
【问题描述】:

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

如果我尝试使用 Simple 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。所以 /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。所以 /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。 /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videoio.so /usr/local/lib/libopencv_videostab.so

6.生成.so文件成功

然后尝试测试python,步骤如下:

7.python

8.>>> 导入 o​​pencvtest

9.>>> opencvtest.main()

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

任何一位专家可以帮助解决这个问题?

【问题讨论】:

  • 调用 main 函数是未定义的行为。
  • 我在java模块中使用了相同的示例opencv程序,并在2天前成功得到了结果。
  • 这就是未定义行为的美妙之处——结果未定义。
  • 您好,柔印谢谢您的回复!使用 swig 测试 python 的任何其他可能的解决方案。

标签: python c++ opencv ubuntu swig


【解决方案1】:

刚刚改了opencvtest.cpp中的方法名main。

记住在第 9 步也要更改方法名称。

对我来说很好用!

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多