簡體   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