繁体   English   中英

DYLD_LIBRARY_PATH / LD_LIBRARY_PATH的替代品

[英]alternatives to DYLD_LIBRARY_PATH/LD_LIBRARY_PATH

我正在开发可在OSX和Linux中使用的python C ++扩展。 目前,我可以使用包装脚本wrapper.sh运行代码:

#!/bin/bash                                                                                                                              
trunk=`dirname $0`                                                                                                                       
trunk=`cd $trunk; pwd`                                                                                                                   
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$trunk/lib                                                                                   
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$trunk/lib/:$trunk/src/hdf5/lib/:$trunk/src/python/lib                                           
$trunk/src/python/bin/python "$@" 

能够像这样设置我的跑步: wrapper.sh app.py

我想做的是消除对wrapper.sh的需要,因此我需要DYLD_LIBRARY_PATH和LD_LIBRARY_PATH的替代方法。 我不能将库放在/usr/local/lib等标准位置,因为在我的机器上,我维护着几个独立的库实例。 也就是说,我的库需要保留在相对于我的安装路径的某个位置。 由于相同的原因,我无法将这些环境变量放入我的登录脚本中。 当前,我需要调用我的wrapper.sh脚本之一来使用关联的库。 我的目标是仅运行app.py ,如果它位于我的安装路径中,则应该能够找到其关联的python和库。 目的是简化用户执行,并简化外部测试(例如鼻子测试)的使用。

当我构建python版本时,一种替代方法似乎是使用rpath:

./configure --enable-shared --prefix=$(CURDIR)/$(PYTHON_DIR) LDFLAGS="-Wl,-rpath,$(CURDIR)/lib/ -Wl,-rpath,$(CURDIR)/src/hdf5/lib -Wl,-rpath,$(CURDIR)/src/python/lib"

即使我的一个库最终由于某种我不清楚的原因最终需要直接复制到trunk/src/python/lib/python2.6/lib-dynload ,该技巧在Linux上似乎也能正常工作。 但是,此技巧在OSX上无效。 看来我需要在所有dylibs库上运行install_name_tool

我想到的另一个选择是做这样的事情:

ln -s wrapper.sh python

这样我的脚本都可以使用#! ../python #! ../python ,但出现Unmatched ".错误。如果我使用#! ../wrapper.sh 。我并不是bash的真正专家...

但是,这些似乎都变得不必要地复杂,这肯定是其他人已经解决的事情了吗? 感谢您的任何建议!

对于python扩展,请考虑使用PYTHONPATH:Python解释器将在PYTHONPATH中搜索.py / .pyc / .pyo / .so模块以及包。 请参阅适用于Python 2.x的 文档以及适用于Python 3.x的文档 特别是在两个页面上名为“模块搜索路径”的部分。 这也引用了似乎表明可以在运行时更新模块搜索路径的信息,如果为true,则意味着您可以将所有逻辑添加到程序中,并且可以自行寻找其库(例如它会在/ usr / libexec / pkgname / ...某处安装副本。

但是,对于除最复杂的情​​况以外的所有情况,设置PYTHONPATH并使用shell脚本或本机编译的二进制包装器启动核心程序都是可以的方法,并且该方法还用于其他语言环境(包括Mono和Java)中。

不知道这在您的情况下是否可以接受(部分)解决方案,但是让ld在Linux上引起注意的库的另一种方法是将库的路径添加到/etc/ld.so.conf ,然后运行ldconfig

对于Mac,我不记得详细信息,但我认为Apple提供了一些资源来分发打包为.app的应用程序,其中包括库或“框架”的某些默认位置(相对于.app的根目录)给他们打电话。 需要从那里进行谷歌搜索-很抱歉,您对此无济于事,但希望您能有所进步:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM