2010-04-28 93 views
1

這是一個初學者問題,並且是this one的後續處理,我指的是GLPK。Python中的新增功能:GLPK無法正確構建/ Python ImportError

我試圖獲得PyGLPK,這是一個啓動並運行的GNU Linear Programming Kit的Python綁定,但無論我做什麼,我似乎都無法構建和安裝GLPK,以便Python能夠正確地找到它。這是在GLPK庫上運行./configure,make和sudo make install之後進行的,並遵循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 

我以爲自己是不是鏈接到別的地方,那它可能有事情做與路徑和環境變量。但是,這裏是我在shell中的能力失敗的地方,而且我對下一步該做什麼感到不知所措。

編輯

  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) 
    

再次,有可能是一個簡單的答案,但我還沒有任何谷歌使用我知道的術語運氣。

+0

了'glpsol'命令不工作的事實只是意味着它可能* *正確鏈接到GLPK C庫。這可能意味着這個工具是靜態鏈接的,或者它可能已經用明確的RPATH(運行時庫搜索路徑)編譯,或者它可能已經用不同的參數編譯。您仍然需要弄清楚它與glpk.so擴展模塊的構建方式有何不同。 – 2010-04-28 12:22:28

回答

1

問題解決了!

托馬斯·沃特的第一個建議是最接近的標記:在glpk.so模塊沒有鏈接到C庫都沒有。其原因是,使用makegcc4.2指定64位體系結構,而Python的distutils模塊上使用gcc-4.0與32位架構構建PyGLPK的源代碼堅持原始GLPK庫構建。

由於我不知道如何將編譯器標誌添加到distutils,我只是重建了GLPK庫,強制distutils編譯器標誌。這是最後的工作。

這似乎是與OS X 10.6的問題。 ./configure腳本查詢系統架構,我認爲這是默認的x86_64,即使Python 2.6在32位二進制文​​件中播放效果最好。

1

這個問題並不是真的特定於Python。 glpk模塊是一個擴展模塊,Python加載的C共享庫。該C共享庫依賴於它封裝的GLPK C庫;加載擴展模塊應加載GLPK C庫,以便擴展模塊可引用來自GLPK C庫的符號,如__glp_lpx_print_ips。顯然,有些失敗。這可能是幾件事情之一:

  1. glpk.so擴展模塊可能不會對GLPK C庫的所有鏈接。這意味着它的構建不需要鏈接到GLPK庫所需的參數-l,這意味着問題出在glpk擴展模塊的構建過程中。您可以通過使用ldd工具來判斷glpk.so是否依賴於C庫。例如:

    % 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參數。

+0

更多關於網絡的問題使我認爲動態鏈接過程出現了問題 - 可能在構建過程中,但測試和修復的能力在這一點上超出了我的想象。事實上,我很樂意指出一個資源,解釋構建過程中發生的事情,以及如何控制它。 – Merjit 2010-04-29 12:52:51