2014-04-27 71 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