我可以在Python virtualenv中安装C / C ++库共享对象吗?

时间:2015-08-07 10:58:56

标签: python c++ python-2.7 virtualenv swig

我正在使用一个C ++库,它可以使用SWIG构建为Python模块。

构建模块会产生一个C ++共享对象,称之为libFoo.so,以及一个包含Python文件Foo.py的Python模块,以及Python用于与之交互的一些共享对象libFoo.so,称为_Foo.so

现在我可以sudo make install C ++库和Python模块,如果加载Python并执行import Foo,一切正常。

如果我sudo make install C ++库,然后将Python模块安装到virtualenv中(通过调整Makefile以便它使用virtualenv版本的Python来运行setup.py),一切都可行。如果我从venv运行Python,我可以导入Foo并正确加载C ++库。在venv之外,我无法导入Foo。

现在,我可以构建和安装C ++库,以便将其自身安装到venv/lib中。然后我可以正确构建Python包并将其安装到virtualenv中。如果我运行virtualenv版本的Python,导入Foo会因为缺少符号而失败,这似乎意味着它找到Foo.py_Foo.so,但不是libFoo.so

如果我这样做

LD_PRELOAD=venv/lib/libFoo.so python

导入成功,库正常工作。 (请注意,在这种情况下,目录venv/lib似乎没什么特别之处。我可以将库安装在完全不同的地方并传入该文件名。)

但是,在尝试加载该库时,我无法让Python查看文件夹venv / lib中的C ++共享对象。设置LD_LIBRARY_PATH似乎没有改变任何东西,我相信因为virtualenv版本的Python忽略了这个变量,或者因为Python模块本身有设置决定了如何加载C ++对象。 / p>

是否有某种方法可以正确地将c ++或C库安装到virtualenv,以便在该虚拟环境中运行的Python代码正确加载它?或者这只是virtualenvs没有设计的东西?

(我不认为这个问题的机制依赖于SWIG,但如果SWIG有任何影响,或者是否有与SWIG特别相关的技术可以解决我的问题,那将是很好的。 )

0 个答案:

没有答案