O错误:/testlib.so:未定义符号:_ZN5boost6system15system_categoryEv



我正在尝试使用g++将包含pcl的c++函数编译到共享库中(当然,我可以使用cmake,但我发现结果没有改变(。

测试代码非常简单:

#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;
}

g++编译命令是:

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

我可以成功地编译它。我把Python包装器写为:

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

经过一点调试,我发现#include <pcl/io/pcd_io.h>这一行就是造成问题的原因。任何其他夹杂物都可以。

我不知道为什么会发生这种事。

任何想法都是有益的,值得赞赏!

事实证明,这个问题有一个简单的解决方案。从本质上讲,这是g++编译器的结果。在这里可以找到一个很好的解释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

然后它就成功了。

最新更新