OSError:./testlib.so:未定义的符号:_ZN5boost6system15system_categoryEv

时间:2018-11-09 23:16:33

标签: c++ compilation runtime-error runtime undefined-symbol

我正在尝试使用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 是引起问题的那一行。任何其他包含都可以。

我不知道为什么会这样。

任何想法都是有益和赞赏的!

1 个答案:

答案 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

然后解决。