从 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();
因此完成了以下步骤:
opencvtest.cpp - 我写的示例代码。
opencvtest.i - 我写的对应中间文件
执行命令:swig -c++ -python opencvtest.i
创建 .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
创建 .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.>>> 导入 opencvtest
9.>>> opencvtest.main()
我收到错误:分段错误(核心已转储)
哪位高手可以帮忙解决问题?
刚刚在 opencvtest.cpp 中更改了方法名称 main。
请记住,还要在第 9 步更改方法名称。
它对我来说很好用!
但是我不知道这个方法调用背后的过程运行。
我将方法名称从 main 更改为 one。
在第 9 步中:>>> opencvtest.one()
我正在尝试使用 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();
因此完成了以下步骤:
opencvtest.cpp - 我写的示例代码。
opencvtest.i - 我写的对应中间文件
执行命令:swig -c++ -python opencvtest.i
创建 .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
创建 .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.>>> 导入 opencvtest
9.>>> opencvtest.main()
我收到错误:分段错误(核心已转储)
哪位高手可以帮忙解决问题?
刚刚在 opencvtest.cpp 中更改了方法名称 main。
请记住,还要在第 9 步更改方法名称。
它对我来说很好用!
但是我不知道这个方法调用背后的过程运行。
我将方法名称从 main 更改为 one。
在第 9 步中:>>> opencvtest.one()