我正在使用一个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特别相关的技术可以解决我的问题,那将是很好的。 )