Ошибка OSE: ./testlib.so: неопределенный символ: _ZN5boost6system15system_categoryEv - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь скомпилировать включенную в pcl функцию c ++ в разделяемую библиотеку, используя g ++ (Конечно, я могу использовать 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> эта строка вызывает проблему. Любое другое включение в порядке.

Я понятия не имею, почему это происходит.

Любая идея полезна и ценится!

1 Ответ

0 голосов
/ 11 ноября 2018

Оказывается, есть простое решение этой проблемы. По сути, это результат компилятора порядка 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

Тогда получается.

...