2015-06-09 45 views
1

我目前使用Python.org的Python 3.4 Mac OS X版本。我正在使用一個Python模塊,它依賴於我在Macports中構建的庫。該腳本不亂開箱運行:我應該如何將cx_freeze與Macports圖書館一起使用?

Traceback (most recent call last): 
    File "magnetx.py", line 6, in <module> 
    import yara 
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so, 2): Library not loaded: /usr/local/lib/libyara.3.dylib 
    Referenced from: /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so 
    Reason: image not found 

我可以解決這個問題,如果我設置變量的環境

export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH" 

不幸的是,它不符合cx_freeze。它一直在尋找/usr/local/lib,當它應該在/opt/local/lib看。

copying /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so -> build/exe.macosx-10.6-intel-3.4/yara.so copying /usr/local/lib/libyara.3.dylib -> build/exe.macosx-10.6-intel-3.4/libyara.3.dylib error: [Errno 2] No such file or directory: '/usr/local/lib/libyara.3.dylib'

我大概可以把Python建立在MacPorts的,但似乎應該是不必要的。有想法該怎麼解決這個嗎?

+0

你是如何獲得'/ Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so'的?它是隨你的Python版本一起提供的還是你以後安裝的? – neverpanic

+0

我在Mac端口中構建libyara後安裝了yara-python。剛剛嘗試使用Mac端口的Python。現在我得到' dyld:庫未加載: /opt/local/Library/Frameworks/Python.framework/Versions/3.4/Python:\' –

回答

2

在OS X,依賴庫是使用絕對路徑引用。複製到二進制文件中的路徑取決於您在構建時鏈接的庫的所謂「安裝名稱」。在你的情況下,yara.so沒有引用你想加載的庫。讓我們來探討幾個原因,這可能是這種情況,和一對夫婦的方式來解決這個問題:

  • 我驗證過libyara.dylib通過MacPorts的安裝(我的系統上)具有/opt/local/lib/libyara.0.dylib的安裝名稱。有時候,構建不使用跨平臺庫構建工具的系統,不希望OS X的特性出現問題(並使用相對路徑或使用相對路徑或/usr/local/lib)。如果是這種情況,這將是軟件構建系統中的一個錯誤,可以使用install_name_tool(1)-id標誌(在鏈接庫之前)手動修復。
  • 你的yara.so副本可能已建成對駐留在/usr/local/lib不同版本的libyara.dylib。這可以解釋爲什麼你yara.so不包含的libyara.dylib的副本MacPorts的正確的絕對路徑,但它也可以防止你在第一位置發生了該錯誤,除非你在/usr/local/lib在編譯的時候有一個副本,刪除它在後面。正如您已經看到的那樣,您可以指示OS X的loader使用DYLD_*系列環境變量來搜索不同的路徑。關於爲什麼cx_freeze不起作用的原因是它不關注DYLD_*系列變量。
  • 如果您確信的libyara.dylibyara.so預計拷貝到/usr/local/lib找到與一個在/opt/local/lib二進制兼容,你可以手動修改yara.so庫加載命令指向使用install_name_tool(1)-change old new參數後者路徑,例如install_name_tool -change /usr/local/lib/libyara.3.dylib /opt/local/lib/libyara.0.dylib /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so。這實際上是在您設置DYLD_FALLBACK_LIBRARY_PATH時,使用裝載程序爲您做的更改修改了二進制文件。由於圖書館的主要版本號似乎有所不同,這可能不是一個安全的假設。
  • 如果您不知道yara.so是否與MacPorts的內部版本libyara.0.dylib兼容,您可以並應該重新編譯yara.so。如果重新編譯正確,您應該可以使用otool -L yara.so檢查庫加載命令並查看以/opt/local開頭的路徑(假設otool -D /opt/local/lib/libyara.0.dylib正確指向自己)。

編輯:我剛剛重新檢查並注意到我的MacPorts build的庫版本號與您的系統預期的版本號不同。這聽起來很像我的案例2。

+0

我自己構建libyara和yara-python,版本匹配。在macports上安裝python34並使用它之後,我現在得到了dyld:Library not loaded:/opt/local/Library/Frameworks/Python.framework/Versions/3.4/Python –

+0

你有沒有設置任何'DYLD_ *'變量集?/opt/local/Library/Frameworks/Python.framework/Versions/3.4/Python存在嗎? – neverpanic

+0

不,是的。這個問題實際上不再適用了;我有不同的問題。 [查看我的新問題的詳細信息](https://stackoverflow.com/questions/30777340/cx-freeze-linking-to-libraries-in-opt-local-rather-than-the-ones-it-copied-over ) –