python的新事物:GLPK无法正确构建 / Python Importerror
-
02-10-2019 - |
题
这是一个初学者的问题,也是对 这个, ,我指向GLPK的地方。
我想得到 pyglpk, ,python绑定 GNU线性编程套件 启动和运行,但是无论我做什么,我似乎都无法构建和安装GLPK,以便Python找到正确的选择。这是在运行./configure,make and sudo在GLPK库上安装后的,并按照pyglpk的说明进行安装。
具体来说,这是我遇到的错误:
>>> import glpk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site- packages/glpk.so, 2): Symbol not found: __glp_lpx_print_ips
Referenced from: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/glpk.so
Expected in: dynamic lookup
我认为某些东西没有链接到其他地方,并且可能与路径和环境变量有关。但是,这是我在外壳中失败的能力,我对下一步的工作感到不知所措。
编辑
我能够运行GLPK求解器(
glpsol
)从命令行,我知道它至少在理论上起作用。在某一时刻,我尝试使用MacPorts安装GLPK版本。从那以后,我已经卸载了此版本,尽管使用了Macports。
这是使用的结果
otool -L
, ,显然是OS X答案ldd
:/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/glpk.so: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
同样,这可能是一个简单的答案,但是使用我所知道的术语,我对Google没有任何运气。
解决方案 2
解决了问题!
托马斯·沃特(Thomas Wouter)的第一个建议最接近标记: glpk.so
模块根本没有链接到C库。原因是 make
使用原始的GLPK库使用 gcc4.2
并指定64位体系结构,而Python的架构 distutils
模块坚持使用PYGLPK的源代码构建 gcc-4.0
具有32位体系结构。
由于我不知道如何将编译器标志添加到 distutils
, ,我只是重建了GLPK库强迫 distutils
编译器标志。这是最终起作用的。
这似乎是OS X 10.6的问题。 ./configure
脚本查询系统体系结构,默认情况下,我认为是 x86_64
, ,即使Python 2.6在32位二进制中表现最好。
其他提示
这个问题并不是真正针对Python的。这 glpk
模块是一个扩展模块,一个python加载的C共享库。 C共享库对其包装的GLPK C库有一个依赖性。加载扩展模块应加载GLPK C库,以便扩展模块可以从GLPK C库中引用符号,例如 __glp_lpx_print_ips
. 。显然,那里的事情是失败的。这可能是几件事之一:
这
glpk.so
扩展模块根本不可与GLPK C库链接。那将意味着它是在没有的-l
与GLPK库链接所需的参数,这意味着问题在于构建过程中glpk
扩展模块。你可以告诉glpk.so
通过使用c库ldd
工具。例如:% ldd /usr/lib/python2.6/lib-dynload/gdbm.so linux-gate.so.1 => (0xb77bb000) libgdbm.so.3 => /usr/lib/libgdbm.so.3 (0xb7799000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7780000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7639000) /lib/ld-linux.so.2 (0xb77bc000)
这表明我
gdbm
扩展模块与libgdbm
共享库(以及其他共享库。)这
glpk.so
扩展模块可以正确地针对GLPK C库链接,但是动态链接器可能无法找到C库。通常,这会产生不同的警告(关于找不到C库),但这可能不会在MacOS上发生。您可以再次使用ldd
工具:它将列出依赖关系,但没有列出已加载的实际文件(而是说“找不到”。)这通常是由于不安装C库或将其安装在动态链接器不知道的地方而引起的。不幸的是,我不知道MacOS X如何进行库查找,以及您应该如何修改其扫描路径。 (在大多数UNIX系统上,您要编辑
/etc/ld.so.conf
或文件中的文件/etc/ld.so.conf.d/
, ,或运行ldconfig -m
.)这
glpk.so
扩展模块可以正确链接,并且动态链接器可以正确找到该模块,但是GLPK扩展模块毕竟不能定义此符号。这可能是GLPK中的错误,也可能是因为动态链接器正在找到一个 不同的 glpk c库(一个不同的版本,或构建不同的版本),也可能是因为GLPK C库的编译方式不同于glpk.so
扩展模块是。但是,这很难诊断,因为这意味着要挖掘实际的C库符号和编译过程中使用的标头文件。
我想,考虑到所有因素,问题是#2。这是最常见的问题,尤其是在安装 /usr/local
, ,这就是什么 ./configure
没有 --prefix
论点通常是这样。