2014-04-27 106 views
0

我的問題開始相同方式分享:Python executable not finding libpython shared library用Cython沒有找到共享庫

我更新的.bashrc與export LD_LIBRARY_PATH=$HOME/local/lib/python/2.7.6/lib,事情都很好。 Python工作,我安裝了點子。但是現在,我在用pip安裝cython時遇到了類似的情況。

gcc -pthread -shared build/temp.linux-x86_64-2.7/tmp/pip_build/cython/Cython/Plex/Scanners.o -L. -lpython2.7 -o build/lib.linux-x86_64-2.7/Cython/Plex/Scanners.so 

/usr/bin/ld: cannot find -lpython2.7 

collect2: ld returned 1 exit status 

error: command 'gcc' failed with exit status 1 

我無法添加到$HOME/local/lib/python/2.7.6/lib/etc/ld.so.conf運行ldconfig因爲我沒有根:當我執行pip install cython我收到此錯誤信息。我的印象是設置LD_LIBRARY_PATH是解決這個問題的方法,但是這對於編譯來說似乎並不正確。有沒有辦法讓編譯器在不運行root命令的情況下查看本地庫?

回答

1

更新:

LD_LIBRARY_PATH在運行時只用動態加載程序,而不是在編譯的時候,所以這不是問題。問題是你忘記把-L/path/to/pylib放在-l之前。我從來不需要使用LIBRARY_PATH,因爲構建需要特定於特定構建的路徑擴展,所以您從不設置LIBRARY_PATH您只使用-L。你只會設置,如果你要定期使用特定的庫進行編譯,即使這樣我也會發現使用-L更好,因爲遲早會導致鏈接器找到錯誤的lib,然後你會忘記這是因爲LIBRARY_PATH是永久設置的。

有許多方法可以在構建中設置-L值:如果從命令行運行編譯器,則不需要該env var,只需指定許多-L作爲命令的一部分;如果你使用makefile,你可以編輯你正在使用的任何make變量,比如CFLAGS或其他,不同的平臺有不同的約定。所以,雖然直接設置-L將始終有效,但只有當makefile使用該變量時才能使用CFLAGS。

現在,這是一個python安裝,因此在哪裏設置這可能不明顯,但我相信有另一種方法比設置LIBRARY_PATH。原則上,你安裝的任何Python包,如果涉及編譯C++模塊,可能需要編輯setup.py來設置庫路徑。例如

Extension(..., 
      library_dirs=['/usr/X11R6/lib'], 
      ...) 

既然你提到nympy,換個地方設置,這可能是在site.cfg(見Supplying NumPy site.cfg arguments to pip)。

舊(錯誤)答案:

設置你在你的bash控制檯LD_LIBRARY_PATH。如果這不起作用,那是因爲你有錯誤的路徑:通過回顯環境變量來檢查。

一旦你得到這個工作,編輯你的.bashrc或.profile,然後退出你的shell並重新啓動它。回顯env var以驗證是否包含您添加的部分。

此外,確保要附加到路徑,而覆蓋它:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/... 
export LD_LIBRARY_PATH 

因爲Python的lib可能取決於。所以在其他文件夾中,如果鏈接器無法找到他們,可能出現像它是沒有找到的python lib。這不是在你的問題中鏈接到的頁面上解釋的。

+0

我想你沒有運氣提到的事情。我能夠通過運行'CFLAGS =「... pypath .../lib」python setup.py install'來構建cython。它感覺不對,但至少它建立了。但是,當我嘗試用類似的技巧來構建numpy時,我遇到了同樣的問題,但是使用gfortran。指定CFLAG和FFLAG不起作用。這有些不對勁。 –

+0

@chester已更新。 – Schollii

+0

在你的更新:是的,這就是爲什麼我以前的評論允許cython編譯。我其實打算把CFLAGS =「 - L ... pypath .../lib」。這更像是一種解決方法,因爲它不適用於我剛纔提到的numpy安裝。設置'LIBRARY_PATH'是使編譯器知道'... pythonpath .../lib'目錄中的'libpython2.7.so'的適當方法。我很感激你花時間看這個。 –

0

確定後,多一些挖我發現這一點:LD_LIBRARY_PATH vs LIBRARY_PATH

設置LIBRARY_PATH以相同的路徑LD_LIBRARY_PATH作出的編譯器知道蟒蛇LIB的。 cython/numpy/scipy所有內置和安裝都沒有問題。

+0

啊哼,現在我看到這個問題,我希望我的更新答案的作品(我從來沒有來設置的環境變量,所以請嘗試更新)。 – Schollii