在构建共享python库表单.cpp文件时缺少opencv库
Missing opencv library while building a shared python library form .cpp file
我有一个c++文件,我想建立一个共享库(。所以文件)从那。下面是.cpp文件:
#include "extract_features.hpp"
boost::python::object hog_feature_extract(boost::python::object &gray, boost::python::object &pts2d, boost::python::object &pts3d) {
static Mat m_gray, m_pts2d, m_pts3d, m_feature_vector;
// Convert into opencv land...
pyopencv_to(gray.ptr(), m_gray, "info", true);
pyopencv_to(pts2d.ptr(), m_pts2d, "info", true);
pyopencv_to(pts3d.ptr(), m_pts3d, "info", true);
// Function call
hog_feature_extractor::shared_extractor().extract(m_gray, m_pts2d, m_pts3d, m_feature_vector);
// Output
PyObject *p_feature_vector = pyopencv_from(m_feature_vector);
boost::python::object boostPyObjFrame(boost::python::handle<>((PyObject*)p_feature_vector));
return boostPyObjFrame;
}
.hpp文件:
#include <boost/python.hpp>
#include "python_helper.hpp"
#include "hog_feature_extractor.hpp"
#include "numpy/ndarrayobject.h"
#include <opencv2/highgui/highgui.hpp>
using namespace boost::python;
boost::python::object hog_feature_extract(boost::python::object &gray, boost::python::object &pts2d, boost::python::object &pts3d);
void *extract_pyarray(PyObject *x) {
return PyObject_TypeCheck(x, &PyArray_Type) ? x : 0;
}
BOOST_PYTHON_MODULE(extract_features) {
import_array();
boost::python::converter::registry::insert( &extract_pyarray, type_id<PyArrayObject>( ) );
def("hog_feature_extract", &hog_feature_extract);
def("hog_feature_preprocess", &hog_feature_preprocess);
def("sift_feature_extract", &sift_feature_extract);
}
#pragma GCC visibility pop
#endif
下面是我用来构建共享库的命令:
g++ -std=gnu++11 -lstdc++ -fPIC -shared -Wl,-z,defs -o /projects/glass_development/lib/linux/extract_features.so extract_features/extract_features.cpp processing/sift_feature_extractor.cpp processing/hog_feature_extractor.cpp processing/pre_extraction_helper.cpp helpers/python_helper.cpp processing/base_feature_extractor.cpp -lpython2.6 -lboost_python -I/share/sw/free/boost/1.41.0/include/ -I/share/sw/free/opencv/2.4.9/include/ -I/projects/glass_development/src/native/processing/ -I/projects/glass_development/src/native/helpers/ -I/usr/include/python2.6
我试图为其他。cpp文件和库(包括opencv和boost库)添加所有必要的路径。但是它给了我一些错误,似乎它不能加载opencv库,这里是错误日志的一部分:
/tmp/ccVzk9cx.o: In function `pyopencv_to(_object const*, cv::Mat&, char const*, bool)':
python_helper.cpp:(.text+0xb54): undefined reference to `cv::Mat::Mat(int, int const*, int, void*, unsigned long const*)'
python_helper.cpp:(.text+0xc04): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
python_helper.cpp:(.text+0xc1a): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
python_helper.cpp:(.text+0xc2d): undefined reference to `cv::transpose(cv::_InputArray const&, cv::_OutputArray const&)'
如果我在上面的命令中删除"-Wl,-z,defs"选项,它会构建。so文件而没有任何错误,但是当我想在python脚本中导入它时,它无法加载库。
我错过了什么?任何建议吗?
下面是 的输出pkg-config --cflags --libs opencv
命令:
-I/share/sw/free/opencv/2.4.9/include/opencv
-I/share/sw/free/opencv/2.4.9/include
/share/sw/free/opencv/2.4.9/lib/libopencv_calib3d.so
/share/sw/free/opencv/2.4.9/lib/libopencv_contrib.so
/share/sw/free/opencv/2.4.9/lib/libopencv_core.so
/share/sw/free/opencv/2.4.9/lib/libopencv_features2d.so
/share/sw/free/opencv/2.4.9/lib/libopencv_flann.so
/share/sw/free/opencv/2.4.9/lib/libopencv_gpu.so
/share/sw/free/opencv/2.4.9/lib/libopencv_highgui.so
/share/sw/free/opencv/2.4.9/lib/libopencv_imgproc.so
/share/sw/free/opencv/2.4.9/lib/libopencv_legacy.so
/share/sw/free/opencv/2.4.9/lib/libopencv_ml.so
/share/sw/free/opencv/2.4.9/lib/libopencv_nonfree.so
/share/sw/free/opencv/2.4.9/lib/libopencv_objdetect.so
/share/sw/free/opencv/2.4.9/lib/libopencv_ocl.so
/share/sw/free/opencv/2.4.9/lib/libopencv_photo.so
/share/sw/free/opencv/2.4.9/lib/libopencv_stitching.so
/share/sw/free/opencv/2.4.9/lib/libopencv_superres.so
/share/sw/free/opencv/2.4.9/lib/libopencv_ts.a
/share/sw/free/opencv/2.4.9/lib/libopencv_video.so
/share/sw/free/opencv/2.4.9/lib/libopencv_videostab.so
/usr/lib64/libXext.so /usr/lib64/libX11.so
/usr/lib64/libICE.so /usr/lib64/libSM.so
/usr/lib64/libGL.so /usr/lib64/libGLU.so
-lcufft -lcublas -lnpps -lnppi -lnppc -lcudart -lrt -lpthread -lm -ldl
命令行缺少通过pkg-config添加的opencv的链接选项:$(pkg-config --libs opencv)
.
当添加这个选项时,共享库可以正确编译:
g++ -std=gnu++11 -lstdc++ -fPIC -shared -Wl,-z,defs -o /projects/glass_development/lib/linux/extract_features.so extract_features/extract_features.cpp processing/sift_feature_extractor.cpp processing/hog_feature_extractor.cpp processing/pre_extraction_helper.cpp helpers/python_helper.cpp processing/base_feature_extractor.cpp -lpython2.6 -lboost_python -I/share/sw/free/boost/1.41.0/include/ -I/share/sw/free/opencv/2.4.9/include/ -I/projects/glass_development/src/native/processing/ -I/projects/glass_development/src/native/helpers/ -I/usr/include/python2.6 $(pkg-config --libs opencv)
相关文章:
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- OpenCV 4.2.0 文件存储分段错误
- 加载"D:UsersPublicDocumentsopencvbuildx64vc14binopencv_world340d.dll",找不到或打开PDB文件
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- OpenCV 安装错误:没有这样的文件或目录"pyopencv_generated_include.h"
- 如何在Visual Studio中添加OpenCV文件
- 无法在 CLion 中编译 OpenCV 头文件
- 使用 Opencv 将姿势值实时写入文本文件
- 如果函数使用 OPENCV Mat 作为输入,如何编写头文件?
- OpenCV 文件存储 - 错误:元素之间的解析错误 (icvYMLParseValue) 缺失
- OpenCV 3.2 文件编译
- 无法使用CMake编译简单的Opencv C++文件
- OpenCV文件存储错误
- 在Android项目中重用OpenCV C++文件
- 如何使用 Eclipse 在 JNI "include"文件夹中添加 openCV 文件
- 如何将数据写入opencv文件夹中的xml文件
- OpenCV文件存储如何读取结构向量
- 如何从opencv 2.2文件中读取固有矩阵和失真矩阵
- 尝试编译一个简单的opencv c ++文件
- 令人困惑的不满意的链接错误,当尝试启动Android + OpenCV文件与JNI组件