Linker Cython找不到共享库
我的问题开始时与此相同: 我用export LD_LIBRARY_PATH=$HOME/local/lib/python/2.7.6/lib更新了.bashrc,一切正常。Python可以工作,我安装了pip。但现在,我在用pip安装cython时遇到了类似的情况。我在执行Linker Cython找不到共享库,linker,cython,Linker,Cython,我的问题开始时与此相同: 我用export LD_LIBRARY_PATH=$HOME/local/lib/python/2.7.6/lib更新了.bashrc,一切正常。Python可以工作,我安装了pip。但现在,我在用pip安装cython时遇到了类似的情况。我在执行pip install cython时收到此错误消息: gcc -pthread -shared build/temp.linux-x86_64-2.7/tmp/pip_build/cython/Cython/Plex/Sca
pip install 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
,因为我没有根目录。我的印象是,设置LD_LIBRARY_路径是解决这个问题的方法,但对于编译来说,这似乎不是真的。有没有办法让编译器在不运行root命令的情况下查看此本地库?更新:
LD_LIBRARY_PATH
仅由动态加载程序在运行时使用,而不是在构建时使用,因此这不是问题所在。问题是您忘记将-L/path/to/pylib
放在-L
之前。我从来没有使用过LIBRARY\u PATH
,因为构建需要特定于给定构建的路径扩展,所以您从未设置LIBRARY\u PATH
,您只需使用-L即可。如果您要定期执行使用特定库的构建,则只需进行设置,即使这样,我还是觉得使用-L更好,因为这迟早会导致链接器找到错误的lib,到那时,您会忘记这是因为LIBRARY\u PATH
是永久设置的
在构建中设置-L值的方法有很多:如果从命令行运行编译器,则不需要该env var,只需在命令中指定所需数量的-L即可;如果使用makefile,则可以编辑正在使用的任何make变量,例如CFLAGS或其他,不同的平台具有不同的约定。因此,尽管直接设置-L总是有效的,但是设置CFLAGS只有在makefile使用的变量是CFLAGS时才有效
现在这是一个python安装,所以在哪里设置它可能并不明显,但我确信除了设置LIBRARY\u PATH
,还有其他方法。原则上,安装的任何Python包,如果涉及C++模块的编译,可能需要编辑StupU.Py来设置库路径。比如说
Extension(...,
library_dirs=['/usr/X11R6/lib'],
...)
既然您提到了nympy,那么另一个可以设置它的地方可能是site.cfg
(请参阅)
旧(错)答案:
在bash控制台中设置LD\u库路径。如果这不起作用,那是因为您选择了错误的路径:通过回显环境变量进行检查
一旦你开始工作,编辑你的.bashrc或.profile,然后退出你的shell并重新启动它。回显环境变量以验证是否包含添加的零件
此外,请确保您正在附加到路径,而不是覆盖路径:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/...
export LD_LIBRARY_PATH
因为python库可能依赖于。因此,在其他文件夹中,如果链接器找不到它们,它可能会显示为找不到python库。您在问题中链接到的页面上没有对此进行解释。好的,在进一步挖掘之后,我发现:
将LIBRARY\u PATH
设置为与LD\u LIBRARY\u PATH
相同的路径可以让编译器知道python库。cython/numpy/scipy所有的构建和安装都没有问题。我尝试了你提到的事情,但没有成功。我能够通过运行CFLAGS=“…pypath…/lib”python setup.py install
让cython进行构建。感觉不太对劲,但至少它成功了。然而,当我尝试使用类似的技巧构建numpy时,我遇到了相同的问题,但使用了gfortran。同时指定CFLAG和FFLAG不起作用。这里有点不对劲。在您的更新中:是的,这就是我之前的评论允许cython编译的原因。我实际上是想把CFLAGS=“-L…pypath…/lib”放进去。这更像是一种变通方法,因为它不适用于我提到的numpy安装。在…pythonpath…/lib
目录中设置libpython2.7.so
库路径是一种使编译器了解libpython2.7.so的正确方法。我很感激你抽出时间来研究这个问题。@ChesterVonWinchester好吧,我想对你的答案投赞成票,因为它包含了一个关键的线索,但我不能,因为它不是答案。答案是使用-L(显然你是这么说的,但我没有明白),如何使用它取决于你的具体情况,正如我在更新的答案中所解释的。对于我的情况,设置LIBRARY\u PATH
是一个更好的解决方案。设置-L
选项并不像运行python setup.py脚本那样简单,而是在makefile中添加此标志。即使我可以将它附加到特定包的setup.py文件中的所有适当位置,这也可能不适用于所有包,迫使我修改setup.py并为每个新包编译标志(请参见第一条注释中的cython vs numpy)。我看到将LIBRARY\u PATH
设置为ldconfig
的本地版本,这正是我所需要的,因为我没有root。除此之外,我将您的问题标记为答案,因为这个问题变成了一个关于编译时链接的问题,而不是关于cython或python的问题,你的答案在这方面为一般情况提供了更好的建议。当然,我现在看到了这个问题,我已经更新了我的答案,希望它能起作用(我从来没有设置过env var,所以请尝试更新)。