我正在尝试使用g ++将包含pcl的c ++函数编译到共享库中(当然,我可以使用cmake,但发现结果没有改变)。
测试代码非常简单:
function Foo () { }
function Bar() { }
Bar.prototype = new Foo();
var foo = new Foo();
var bar = new Bar();
bar instanceof Bar; // true
bar instanceof Foo; // true
g ++编译命令为:
#include <iostream>
#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/extract_indices.h>
extern "C" int add_one(int i)
{
// pcl::PCLPointCloud2::Ptr cloud_blob (new pcl::PCLPointCloud2), cloud_filtered_blob (new pcl::PCLPointCloud2);
return i+1;
}
int main()
{
return 0;
}
我可以成功编译它。我将Python包装器写为:
g++ -shared -L/usr/lib/x86_64-linux-gnu/ -I/usr/include/pcl-1.7 -I/usr/include/eigen3 -o testlib.so -fPIC extract_indices.cpp
运行此命令时,它显示:
import sys
import os
from ctypes import cdll
lib = cdll.LoadLibrary('./testlib.so')
print lib.add_one(5)
经过一些调试,我发现Traceback (most recent call last):
File "test.py", line 4, in <module>
lib = cdll.LoadLibrary('./testlib.so')
File "/home/weizhang/anaconda2/lib/python2.7/ctypes/__init__.py", line 444, in LoadLibrary
return self._dlltype(name)
File "/home/weizhang/anaconda2/lib/python2.7/ctypes/__init__.py", line 366, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./testlib.so: undefined symbol: _ZN5boost6system15system_categoryEv
是引起问题的那一行。任何其他包含都可以。
我不知道为什么会这样。
任何想法都是有益和赞赏的!
答案 0 :(得分:0)
事实证明,此问题有简单的解决方案。本质上,这是由命令g ++编译器导致的。 here可以很好地解释g ++的顺序。
我将顺序更改为:
g++ -Wall -shared -fPIC extract_indices.cpp -o testlib.so -L/usr/lib/x86_64-linux-gnu/ -I/usr/include/pcl-1.7 -I/usr/include/eigen3 -lboost_system -lboost_filesystem
然后解决。