使用pybind11编译c++代码给python调用与undefined symbol问题

17 篇文章 0 订阅
3 篇文章 0 订阅
  1. 使用cmake编译安装pybind11:
# Classic CMake
cd pybind11
mkdir build
cd build
cmake ..
make install
  1. 使用cmake编译原本的c++文件,CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.4)
project(skyeyec_cpp)

find_package(pybind11 REQUIRED)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

pybind11_add_module(skyeye_count test_sky.cpp src/Hungarian.cpp src/logger.cpp)

target_link_directories(skyeye_count PUBLIC 
                     /usr/local/cuda/lib64
                     /home/xmj/.TensorRT-8.0.1.6/lib
                     )
                     
target_link_libraries(skyeye_count PUBLIC 
                      opencv_core
                      pthread
                      )
target_link_libraries(skyeye_count PUBLIC
                      nvinfer
                      nvparsers
                      nvinfer_plugin
                      nvonnxparser      
                      )   
target_include_directories(skyeye_count PUBLIC
                            /usr/include/opencv4
                            /usr/local/include
                            src
                            .TensorRT-8.0.1.6/include)

  1. c++代码中加入python的模块调用接口:
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <cstdlib>
#include <fstream>

#include "buffers.h"
#include "NvInfer.h"
#include <cuda_runtime_api.h>
#include "Hungarian.h"
#include <LightGBM/c_api.h>
#include <algorithm>
#include "opencv2/opencv.hpp"

int proc_one_video(string output_dir, string mask_filename, string video_filename, string detect_modelf, string weight_modelf, string color_modelf, bool save_result=true, bool need_weight=true){
	return 0;
	}
template <typename T>
T square(T x){
    return x*x;
};
PYBIND11_MODULE(skyeye_count, m){
    m.doc() = "run one video count";
    m.def("square", &square<double>);
    m.def("square", &square<float>);
    m.def("proc_one_video", &proc_one_video);

};
  1. 编译运行,生成so库:
mkdir build
cd build
cmake ..
make
  1. 使用python调用so库:
import sys
sys.path.append('.')
import skyeye_count

print(skyeye_count.square(2))
print(skyeye_count.proc_one_video("f",
                            "e.png", 
                            "d.mp4", 
                            "c.engine", 
                            "b.engine",
                            "a.txt",
                            True,True))
  1. 调用python文件时遇到undefined symbol问题,原因是so库依赖有问题,同一个库在多个文件夹下都有且版本不同,解决方法:
    删除一个文件夹下的库,例如我删除了anaconda后装的so库,使用系统文件夹里自带的库。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值