|
笔者因科研需要,欲采用ceres库函数。奈何python版本的ceres绑定实在难装,无奈之下只得采用python调用C++函数的办法,将ceres代码写在C++中,python传参并进行函数调用加以实现。
主要参考:
问题1:编译问题
笔者所写的C++代码如下
#include <iostream>
#include <string>
#include<ceres/ceres.h>
using namespace std;
extern &#34;C&#34;
{
int optimization(float *a, float *b)
{
ceres::Problem problem;
for(int i = 0; i < 7; i++)
cout << a << &#34; &#34;;
cout << endl;
for(int j = 0; j < 5; j++)
cout << b[j] << &#34; &#34;;
cout << endl;
return 0;
}
}
当采用参考贴命令进行编译时
g++ -o xxx.os -shared -fPIC xxx.cpp编译没有问题,但在运行python主程序时,会发生以下错误
Traceback (most recent call last):
File &#34;main.py&#34;, line 37, in <module>
dataset.process()
File &#34;/home/thinking/detection_ws/fusion.py&#34;, line 91, in process
self.refine(_3d_predictions_dict, _2d_predictions, data_association_dict, calib_file_name)
File &#34;/home/thinking/detection_ws/fusion.py&#34;, line 260, in refine
dll = ctypes.cdll.LoadLibrary(&#39;./optimization.so&#39;)
File &#34;/home/thinking/anaconda3/envs/yolo/lib/python3.7/ctypes/__init__.py&#34;, line 442, in LoadLibrary
return self._dlltype(name)
File &#34;/home/thinking/anaconda3/envs/yolo/lib/python3.7/ctypes/__init__.py&#34;, 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(&#39;./optimization.so&#39;)
c = dll.optimization(a, b)发现如果没有 dtype=np.float32 则b的打印会出问题 |
|