如何使用Boost.Python

如何使用Boost.Python,python,c++,boost,Python,C++,Boost,我最近刚刚发现了Boost.Python,我正试图弄清楚它是如何工作的。我试图通过。然而,我得到了 link.jam: No such file or directory 如示例所示运行bjam时(这似乎只是一个警告), 及 这仍然给了我一个: /usr/bin/ld: impossibile trovare : File o directory non esistente collect2: error: ld returned 1 exit status. 最后,我终于成功了。首先,我按

我最近刚刚发现了Boost.Python,我正试图弄清楚它是如何工作的。我试图通过。然而,我得到了

link.jam: No such file or directory
如示例所示运行bjam时(这似乎只是一个警告), 及

这仍然给了我一个:

/usr/bin/ld: impossibile trovare : File o directory non esistente
collect2: error: ld returned 1 exit status.

最后,我终于成功了。首先,我按照Dan的建议修复了链接器问题。它最终编译了,但我仍然得到:

ImportError: libboost_python.so.1.55.0: cannot open shared object file: No such file or directory
问题是python模块无法正确加载,因此我需要添加另一个链接器选项。在这里,我报告最终的Makefile:

# location of the Python header file
PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)

# location of the Boost Python include files and library

BOOST_INC = ${HOME}/boost/include
BOOST_LIB = ${HOME}/boost/lib

# compile mesh classes
TARGET = hello_ext

$(TARGET).so: $(TARGET).o
    g++ -shared -Wl,-rpath,$(BOOST_LIB) -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so

$(TARGET).o: $(TARGET).C
    g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).C
请注意-Wl,-rpath,选项,它显然使新创建的共享库可供python脚本使用。

@Dan:谢谢你的宝贵提示。

你是否在启用Python库的情况下构建了boost库?是否存在相应的boostpython二进制文件,它们是否在库搜索路径中?为什么不直接使用Ubuntu已有的boost软件包呢?查看软件包数据库,看起来Ubuntu 14.04上存在boost 1.55。@Dan我安装了针对python2.7的boost库,因为我需要这个版本。然而,我不知道如何使用标准的ubuntu软件包数据库来实现这一点。为了完整起见,我安装了boost以使用一个名为hoomd的软件,但我使用boostHmm构建最后一个软件时没有遇到任何问题,查看您在尝试手动构建时使用的命令,最后我看到了
-Wl,-fPIC-expose dynamic
。这似乎不对<代码>-fPIC是一个编译器选项
-Wl,option
将选项传递给链接器。应该向链接器传递一个选项
--导出动态
。逗号和选项之间不应该有空格。您是否再次尝试使使用bjam编译的模块正常工作?这似乎已经建立了正确的,系统只是找不到您的自定义。因此,您可能没有安装到任何标准位置。请参阅或中的第3.5节,开始时只需将模块的boost dependencies复制到它所在的同一目录中即可。@Rebrado请将解决方案作为答案发布,而不是作为问题的编辑。如果您找到了解决方案,您可以回答自己的问题,事实上,我们鼓励您这样做。链接共享库不需要
-Wl,--export dynamic
。仅用于链接可执行文件。
/usr/bin/ld: impossibile trovare : File o directory non esistente
collect2: error: ld returned 1 exit status.
ImportError: libboost_python.so.1.55.0: cannot open shared object file: No such file or directory
# location of the Python header file
PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)

# location of the Boost Python include files and library

BOOST_INC = ${HOME}/boost/include
BOOST_LIB = ${HOME}/boost/lib

# compile mesh classes
TARGET = hello_ext

$(TARGET).so: $(TARGET).o
    g++ -shared -Wl,-rpath,$(BOOST_LIB) -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so

$(TARGET).o: $(TARGET).C
    g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).C