在 Linux 上使用 Python 模块编译 GEOS 3.6.2

Posted

技术标签:

【中文标题】在 Linux 上使用 Python 模块编译 GEOS 3.6.2【英文标题】:Compiling GEOS 3.6.2 with Python module on Linux 【发布时间】:2018-03-29 16:52:22 【问题描述】:

尝试在已编译 Python 3.6.4 的 Linux 系统上安装 GEOS-3.6.2。 我正在尝试使用以下命令制作包:

export PYTHON=/usr/local/bin/python3 && make && sudo make install

配置命令失败:

...much snipped...
checking for swig... /usr/bin/swig
checking for SWIG version... 3.0.8
configure: SWIG executable is '/usr/bin/swig'
configure: SWIG library directory is '/usr/share/swig3.0'
checking for python version... 3.6
checking for python platform... linux
checking for python script directory... $prefix/lib/python3.6/site-packages
checking for python extension module directory... $exec_prefix/lib/python3.6/site-packages
checking for Python include path... /usr/local/include/python3.6m
checking for Python library path... 
configure: error: cannot find Python library path

我已经确认 Python 库存在于 /usr/local/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.a`

我用简单的./configure --prefix=/usr/local && make && sudo make install编译了python

系统资料:

~/Downloads/geos-3.6.2$ uname -a
Linux Sleipnir 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
~/Downloads/geos-3.6.2$ which python3
/usr/local/bin/python3
~/Downloads/geos-3.6.2$ python3 -V
Python 3.6.4
~$ cat /etc/*release*
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

【问题讨论】:

请编辑您的问题以包括操作系统名称和版本。 ...缺少的“libpython”:一个典型的例子是/usr/lib(64)/ libpython3.so -> libpython3.6m.so.1.0 。 ...您是否忘记使用--enable-shared 配置Python3? 据我所知,您要求的所有信息都已经在上面了?你可以说得更详细点吗?至于启用共享,不,我没有这样做,但在以前版本的 python/geos 中我不需要。我会试试看它是否能解决任何问题。 您的 libpython3.6m.a 不在系统 LD_LIBRARY_PATH 中。 /usr/lib(64) 是:我在上一条评论中的提示。 /usr/local/lib/ 通常也包含在 LD_LIBRARY_PATH 中。 .../usr/local/lib/python3.6/config-3.6m-x86_64-linux-gnu/ 不是。 ....在您的问题中找不到操作系统名称/版本:cat /etc/*release* 我的错:` $ cat /etc/*release* DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS" NAME="Ubuntu" VERSION="16.04.4 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.4 LTS" VERSION_ID="16.04" HOME_URL="ubuntu.com" SUPPORT_URL="help.ubuntu.com" BUG_REPORT_URL="bugs.launchpad.net/ubuntu" VERSION_CODENAME=xenial UBUNTU_CODENAME =xenial` 另外,感谢您提供的信息,它让我更好地了解了它在寻找什么。 请不要在标题中添加“已解决”之类的内容。如果您设法找到自己的解决方案,然后发布一个答案(您做到了,太好了),并在超时后接受您自己的答案。 【参考方案1】:

感谢上面 Knud 的 cmets 能够让 GEOS 正确编译。 Python 现在配置了./configure --prefix=/usr/local --enable-shared,后跟sudo ldconfig -v /usr/local/lib

按照这些操作,GEOS 使用 export PYTHON=/usr/local/bin/python3 && ./configure --prefix=/usr/local --enable-python && make && sudo make install 编译得很好

更新:在尝试在另一个系统上构建 GEOS 时,我再次遇到了这个问题。这次的解决方案略有不同。 Python 编译构建库,文件名为libpython3.6m.so.1.0。 GEOS 配置正在寻找libpython$PYTHON_VERSION.* 的模式。如果 Python 版本被确定为 3.6,即系统返回的版本,则由于添加了“m”,构建将失败。

额外的修复是在库目录中添加符号链接为ln -s libpython3.6m.1.0 libpython3.6.so

【讨论】:

以上是关于在 Linux 上使用 Python 模块编译 GEOS 3.6.2的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 g++ 在 Linux 上使用 boost/shared_ptr.hpp 编译 c++ 程序

使用 g++ 在 Linux 上使用 Valgrind 拦截全局函数

在 ubuntu 上使用 linux 源码编译模块

OpenCV C++ Linux g++ 编译

python如何调用扩展模块

使用 g++ 编译,使用向量和数组库