我无法使用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
答案 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 /'。