[英]Trouble with linking boost::python::numpy
我寫了一個小例子來說明發生了什么。
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();
我不知道如何解決它。 我在論壇上讀過類似的問題,但沒有一個解決方案對我有幫助。 我嘗試更新提升,更新 python,鏈接庫,在編譯期間將生成的模塊放在其他模塊之前 - 沒有任何幫助。 我將不勝感激任何幫助。
在仿生上-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/numpy.hpp
替換你的代碼boost/python/numpy.hpp
也用namespace np = boost::python::numpy
替換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)
我在鏈接python3或更高版本時也遇到了這個問題。 在這種情況下,有幫助的是添加這些鏈接選項:
-lboost_python3 -lboost_numpy3
顯然-lboost_numpy
沒有找到,因此我們需要使用-lboost_numpy3
我設法通過以下命令編譯和鏈接 OP 提供的代碼與 Boost 1.71.0 和 Python 3.5:
g++ -o my_test.so -fPIC -shared my_test.cpp \
-I/usr/include/python3.5 `# for pyconfig.h` \
-L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu `# for libpython3.5 or libpython3.5m` \
-lpython3.5 \
-I/usr/local/boost_1_71_0/include `# for Boost header files` \
-L/usr/local/boost_1_71_0/lib `# for Boost binary files` \
-lboost_python35 -lboost_numpy35
在我的 Linux 系統 (Debian Stretch) 上,Boost 庫位於/usr/local/boost_1_71_0
。
我不確定你的 python 版本和 boost 版本。 我的版本: 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 版本的變體彼此相鄰托管。( 從此處)您可以檢查您的 boost 庫路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.