查看: 130|回复: 1

python 调用 C++ 函数

[复制链接]

5

主题

13

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2022-9-23 17:26:21 | 显示全部楼层 |阅读模式
笔者因科研需要,欲采用ceres库函数。奈何python版本的ceres绑定实在难装,无奈之下只得采用python调用C++函数的办法,将ceres代码写在C++中,python传参并进行函数调用加以实现。
主要参考:
问题1:编译问题

笔者所写的C++代码如下
#include <iostream>
#include <string>
#include<ceres/ceres.h>

using namespace std;

extern "C"
{
   
    int optimization(float *a, float *b)
    {
        ceres::Problem problem;
        
        for(int i = 0; i < 7; i++)
            cout << a << " ";
        cout << endl;

        for(int j = 0; j < 5; j++)
            cout << b[j] << " ";
        cout << endl;
        
        
        return 0;
    }
}
当采用参考贴命令进行编译时
g++ -o xxx.os -shared -fPIC xxx.cpp编译没有问题,但在运行python主程序时,会发生以下错误
Traceback (most recent call last):
  File "main.py", line 37, in <module>
    dataset.process()
  File "/home/thinking/detection_ws/fusion.py", line 91, in process
    self.refine(_3d_predictions_dict, _2d_predictions, data_association_dict, calib_file_name)
  File "/home/thinking/detection_ws/fusion.py", line 260, in refine
    dll = ctypes.cdll.LoadLibrary('./optimization.so')
  File "/home/thinking/anaconda3/envs/yolo/lib/python3.7/ctypes/__init__.py", line 442, in LoadLibrary
    return self._dlltype(name)
  File "/home/thinking/anaconda3/envs/yolo/lib/python3.7/ctypes/__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./optimization.so: undefined symbol: _ZN5ceres7ProblemC1Ev经查询相关贴,感觉是调用ceres库时出现的问题
于是参考g++编译ceres测试代码
最终采用以下命令编译C++代码:
g++ -o optimization.so -shared -fPIC optimization.cpp -rdynamic /usr/local/lib/libceres.a -lcholmod   -llapack -lf77blas -lcxsparse  -lglog -I/usr/loca/include -isystem /usr/include/eigen3 -I/usr/include/suitesparse -fopenmp编译成功!

问题2:传参问题

编译成功后,笔者遇到第二个问题,即传参问题
python代码如下
a = a.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
b = np.array([b[0],
              b[1],
              b[2],
              b[3],
              b[4]],dtype=np.float32)
            
b = b.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
            
dll = ctypes.cdll.LoadLibrary('./optimization.so')
c = dll.optimization(a, b)发现如果没有 dtype=np.float32 则b的打印会出问题
回复

使用道具 举报

1

主题

5

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2025-3-7 09:42:36 | 显示全部楼层
支持,赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表