在boost python编译模块中缺少库

时间:2014-08-05 18:46:11

标签: python c++ boost

我无法使用Boost Python编译和运行一个简单的hello world示例。在以前的安装(在家里)我能够使用sudo命令在/ usr / local /中安装Boost但在我当前的位置我没有管理员访问权限,因此我必须将其安装在另一个目录中(./boost_1_55_0)

代码似乎编译但是当我运行示例python脚本时,我收到以下错误:

ImportError: libboost_python.so.1.55.0: cannot open shared object file: No such file or directory

此共享对象确实存在于./boost_1_55_0/stage/lib目录中。所以在搜索我的答案时,我尝试将以下内容添加到我的Python脚本中:

import os
os.environ['LD_LIBRARY_PATH']='./boost_1_55_0/stage/lib/'

但我得到了同样的结果。在所有情况下,我也尝试过绝对路径。另外,我查看了以下stackoverflow问题:

set LD_LIBRARY_PATH from Makefile

并试图实施它,但没有运气。我已经附加了makefile,.cpp文件和测试脚本,以供任何人提供帮助。作为一个额外的信息,我尝试使用distutils编译,但无法使其工作。我也附上了那个python脚本。

感谢您的帮助,


生成文件:

# location of the Python header files

PYTHON_VERSION  = 2.7
PYTHON_INCLUDE  = /usr/local/python/canopy_1.1.0/appdata/canopy-1.1.0.1371.rh5-x86_64/include/python2.7
PYTHON_LIB  = /usr/local/python/canopy_1.1.0/appdata/canopy-1.1.0.1371.rh5-x86_64/lib

# location of the Boost Python include files and library

BOOST_INC = ./boost_1_55_0
BOOST_LIB = ./boost_1_55_0/stage/lib/

# compile mesh classes
TARGET = evoalg_gen

$(TARGET).so: $(TARGET).o
LD_LIBRARY_PATH=$(BOOST_LIB) g++ -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -L$(PYTHON_LIB) -lpython$(PYTHON_VERSION) -lboost_python -o $(TARGET).so

$(TARGET).o: $(TARGET).cpp
LD_LIBRARY_PATH=$(BOOST_LIB) g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cpp

evoalg_gen.cpp:

#include <Python.h>
#include <boost/python.hpp>

char const* greet()
{
   return "hello, world";
}

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

test_helloworld.py:

import os
os.environ['LD_LIBRARY_PATH']='./boost_1_55_0/stage/lib/'

#import EvoAlgs
import evoalg_gen
print hello_ext.greet()

setup.py:

from distutils.core import setup, Extension

module1 = Extension('EvoAlgs',
include_dirs = ['/raid1/nathanm/9502_Model/c++/boost_1_55_0'], ### Boost Directory
library_dirs = [''#, ### Boost Library
                #'/usr/local/python/epd-7.1-2-rh5-x86_64/lib/' ### Python Library
                ],
libraries = ['boost_python'],
sources = ['evoalg_gen.cpp'])

setup (name = 'EvoAlgs',
version = '0.1',
description = 'This is a collection of evolutionary algorithms',
ext_modules = [module1])

其他信息:

运行命令:

LD_LIBRARY_PATH=./boost_1_55_0/stage/lib python test_helloworld.py

给出以下错误:

LD_LIBRARY_PATH=./boost_1_55_0/stage/lib: Command not found.

根据@ kirbyfan64sos的建议添加,-rpath,。/ boost_1_55_0 / stage / lib /到我的make文件会导致运行时出现以下错误:

ImportError: ./boost_1_55_0/stage/lib/libboost_python.so.1.55.0: undefined symbol: PyUnicodeUCS4_FromEncodedObject

1 个答案:

答案 0 :(得分:0)

为了使用LD_LIBRARY_PATH,它必须在程序实际运行之前设置,而不是在它运行时(什么都不做)或在编译时(仅设置编译器本身的路径)。例如:

LD_LIBRARY_PATH=./boost_1_55_0/stage/lib python my_script.py

但是,您可以使用'-Wl,-rpath'将库路径硬编码到库中。所以,在这种情况下,当链接时,你会使用'-Wl,-rpath ,./ boost_1_55_0 / stage / lib /'。