Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker Cython找不到共享库_Linker_Cython - Fatal编程技术网

Linker 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

我的问题开始时与此相同:

我用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/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,所以请尝试更新)。