这是一个初学者的问题,也是对 这个, ,我指向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

我认为某些东西没有链接到其他地方,并且可能与路径和环境变量有关。但是,这是我在外壳中失败的能力,我对下一步的工作感到不知所措。

编辑

  1. 我能够运行GLPK求解器(glpsol)从命令行,我知道它至少在理论上起作用。

  2. 在某一时刻,我尝试使用MacPorts安装GLPK版本。从那以后,我已经卸载了此版本,尽管使用了Macports。

  3. 这是使用的结果 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. 。显然,那里的事情是失败的。这可能是几件事之一:

  1. 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 共享库(以及其他共享库。)

  2. glpk.so 扩展模块可以正确地针对GLPK C库链接,但是动态链接器可能无法找到C库。通常,这会产生不同的警告(关于找不到C库),但这可能不会在MacOS上发生。您可以再次使用 ldd 工具:它将列出依赖关系,但没有列出已加载的实际文件(而是说“找不到”。)

    这通常是由于不安装C库或将其安装在动态链接器不知道的地方而引起的。不幸的是,我不知道MacOS X如何进行库查找,以及您应该如何修改其扫描路径。 (在大多数UNIX系统上,您要编辑 /etc/ld.so.conf 或文件中的文件 /etc/ld.so.conf.d/, ,或运行 ldconfig -m.)

  3. glpk.so 扩展模块可以正确链接,并且动态链接器可以正确找到该模块,但是GLPK扩展模块毕竟不能定义此符号。这可能是GLPK中的错误,也可能是因为动态链接器正在找到一个 不同的 glpk c库(一个不同的版本,或构建不同的版本),也可能是因为GLPK C库的编译方式不同于 glpk.so 扩展模块是。但是,这很难诊断,因为这意味着要挖掘实际的C库符号和编译过程中使用的标头文件。

我想,考虑到所有因素,问题是#2。这是最常见的问题,尤其是在安装 /usr/local, ,这就是什么 ./configure 没有 --prefix 论点通常是这样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top