Проблема с линковкой boost :: python :: numpy - PullRequest
0 голосов
/ 26 июня 2018

Я написал небольшой пример, чтобы показать, что происходит.

my_test.cpp

#include <iostream>
#include <boost/python/numpy.hpp>
namespace np = boost::python::numpy;
int my_Foo() 
{
    Py_Initialize();
    np::initialize();
    std::cout << "hello\n";
    return 0;
}
BOOST_PYTHON_MODULE(my_test)
{
    using namespace boost::python;
    def("my_Foo", my_Foo);
}

py_test.py

import my_test as t
t.my_Foo();

Я все компилирую командой:

g++ -shared -fPIC -o my_test.so my_test.cpp -lboost_python -lpython2.7 -I/usr/include/python2.7

И я получаю эту ошибку:

ImportError: /home/my_test.so: undefined symbol: _ZN5boost6python5numpy10initializeEb

И это работает, когда я комментирую эту строку

//np::initialize();

Понятия не имею, как это исправить. Я читал похожие вопросы на форуме, но ни одно из решений не помогло мне. Я пробовал обновить boost, обновить python, связать библиотеки, поместить сгенерированный модуль перед другим модулем во время компиляции - ничего не помогает. Буду благодарен за любую помощь.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Я также столкнулся с этой проблемой при линковке для python3 или выше.В этом случае помогло добавить следующие параметры связывания:

-lboost_python3 -lboost_numpy3

Видимо -lboost_numpy не найдено, поэтому нам нужно использовать -lboost_numpy3

0 голосов
/ 10 января 2019

Я не уверен, что ваша версия Python и буст версия.моя версия: python2.7 boost1.67


Если cmakeList.txt:

link_libraries(${Pangolin_LIBRARIES}
               boost_python
               boost_numpy
               assimp
               util)
, измените его на
link_libraries(${Pangolin_LIBRARIES}
               boost_python27
               boost_numpy27
               assimp
               util)
, потому что:

Boost.Pythonимена библиотек теперь содержат суффикс версии Python.Таким образом, вариант, скомпилированный с Python 2.7, создаст имена библиотек boost_python27 и boost_numpy27 и т. Д., Что позволит размещать варианты для нескольких версий Python рядом друг с другом. ( отсюда ) вы можете проверить путь к вашей библиотеке повышения.

0 голосов
/ 26 июня 2018

На Bionic -lboost_python недостаточно.Вы пропали без вести -lboost_numpy.

В Xenial вы еще не найдете готовых библиотек:

sudo apt -y install libpython2.7-dev libboost-python-dev
git clone https://github.com/ndarray/Boost.NumPy
cd Boost.Numpy
mkdir build
cd build
cmake ..
make 
sudo make install

замените в своем коде boost/python/numpy.hpp на boost/numpy.hpp и замените namespace np = boost::python::numpy на namespace np = boost::numpy;|

g++ -o test5.so -fPIC -shared test5.cpp -lboost_python -lboost_numpy -I/usr/local/include -I/usr/include/x86_64-linux-gnu/python2.7/ -I/usr/include/python2.7
enter code here

 ~> LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64 ldd test5.so 
   linux-vdso.so.1 =>  (0x00007ffe9cd36000)
   libboost_python-py27.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0 (0x00007ffba47bd000)
   libboost_numpy.so => /usr/local/lib64/libboost_numpy.so (0x00007ffba45a2000)
   libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ffba4216000)
   libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ffba3ffe000)
   libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffba3c34000)
   libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffba3a17000)
   libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007ffba3489000)
   libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffba3180000)
   /lib64/ld-linux-x86-64.so.2 (0x00007ffba4c11000)
   libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ffba2f66000)
   libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffba2d62000)
   libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007ffba2b5f000)
...