跳到內容

GLPK/Linux 作業系統

來自華夏公益教科書

此頁面介紹如何在 Linux 作業系統上構建和安裝 GLPK。Linux 上的標準編譯器套件是 GCC。儘管如此,也可以安裝和使用其他編譯器。

預打包選項:作為一個 替代方案,GLPK 也可能作為 Debian(Ubuntu 使用)或 RPM(Fedora 使用)包提供。安裝包比編譯更方便,但包往往比釋出版滯後一到多個版本。手動編譯還可以讓你自定義構建配置,使生成的庫更好地匹配你的環境和需求。

因此,鼓勵新使用者從原始碼構建 GLPK。如果你需要幫助,可以隨時從help-glpk郵件列表獲取幫助。

關鍵檔案

[編輯 | 編輯原始碼]

下表顯示了與 Linux 相關的關鍵 GLPK 檔案

檔案 角色 預設值 檔案
glpsol 命令列求解器 /usr/local/bin 可執行檔案
glpk.h GLPK API 標頭檔案 /usr/local/include C 語言標頭檔案
libglpk.a 靜態庫 /usr/local/lib 常規存檔檔案
libglpk.so 共享庫 /usr/local/lib 指向共享物件檔案的符號連結

注意:如果 GLPK 作為 Linux 包 新增,則會從指示的路徑中省略“/local” 部分。

警告API 使用者不應該包含除glpk.h.

顯示的路徑詳細資訊假設正常的構建和安裝。靜態庫用於編譯時連結,共享庫用於執行時連結。根據 GLPK 的配置方式,兩者可能並不存在。使用者有時會遇到檔案位置和搜尋路徑的問題——如果是這樣,下面給出了一些故障排除提示。GLPK 使用的位置符合Linux 檔案系統層次結構標準

安裝過程

[編輯 | 編輯原始碼]

以下說明指的是

  • 從 GLPK 版本 4.42 到 4.65 的代表性升級。

請注意

  • 如果你正在進行全新安裝,請跳過與 4.42 相關的任何說明
  • 對於更高版本的版本,4.65 應該用相關版本號替換。

先決條件

[編輯 | 編輯原始碼]

為了編譯,需要 gcc。 GCC 是 GNU 編譯器集合。該集合包含一個 C 語言 編譯器。你可以使用以下命令檢查已安裝的版本

$ gcc --version

使用 ODBC 需要以下任一軟體包:iODBCunixODBC軟體包。

預設安裝路徑為/usr/local。在 Fedora 派生的發行版(Fedora、Red Hat、Centos、...)上/usr/local/lib預設情況下不在庫搜尋路徑中。你可以使用以下命令新增路徑

$ sudo su
# echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf
# /sbin/ldconfig
# exit

獲取原始碼

[編輯 | 編輯原始碼]

將 GLPK 4.65 壓縮包下載到使用者空間中的目錄(如果你已經有了,請跳過此步驟)

$ wget ftp://ftp.gnu.org/gnu/glpk/glpk-4.65.tar.gz
$ wget ftp://ftp.gnu.org/gnu/glpk/glpk-4.65.tar.gz.sig

驗證壓縮包

$ gpg --verify glpk-4.65.tar.gz.sig glpk-4.65.tar.gz

如果你的金鑰環中缺少金鑰,可以使用以下命令安裝它

$ gpg --recv-keys 5981E818

然後解壓縮壓縮包

$ tar -xzvf glpk-4.65.tar.gz
$ cd glpk-4.65

應用任何後續的 補丁——很少需要,因為重要的錯誤修復通常會觸發新的釋出。

尋找 PDF 文件(或者切換到子目錄doc並查詢)

$ find . -name "*.pdf" -print

強烈建議你在繼續之前熟悉“在您的計算機上安裝 GLPK”,該文件位於doc/glpk.pdf中。你可以使用以下命令檢視它

$ evince doc/glpk.pdf &

或者,類似的資訊以文字形式提供

$ less INSTALL        # q to quit

接下來確定你要使用哪些配置選項。例如,對 ODBC(開放資料庫連線)的支援允許 MathProg 與關係資料庫和電子表格互動。列出選項(less管道提供滾動,按q退出)

$ ./configure --help | less

使用你的系統包管理器安裝任何依賴的 Linux 包。例如,ODBC 需要存在相應的 ODBC dev(開發人員)標頭檔案包。

現在配置 GLPK。預設情況下,GLPK 構建庫的靜態版本和共享版本。常見的選項包括(你只需要其中一個命令)

$ ./configure                              # default
$ ./configure --enable-dl --enable-odbc    # for ODBC support with dynamic linking to ODBC library
$ ./configure --disable-shared             # prevent GLPK shared library

配置選項--enable-dl不會指示 GLPK 構建共享庫,而是告訴 GLPK 動態連結支援庫。

如果你需要設定環境變數,請在任何配置選項後的配置命令列上設定——使用--help瞭解更多詳情。

不要使用包含空格字元的路徑,因為這些路徑不受automake.[1]

支援

編譯

[編輯 | 編輯原始碼]現在編譯並檢查 GLPK。該make選項--jobs=4

$ make --jobs=4
$ make check
OPTIMAL LP SOLUTION FOUND

  允許在多核硬體上並行處理——在單核(較舊)機器上或遇到錯誤訊息時,應省略它。根據你的 CPU 效能,編譯步驟可能需要 15 秒到幾分鐘。

$ examples/glpsol --version
GLPSOL: GLPK LP/MIP Solver, v4.65

檢查本地 GLPSOL 版本

安裝

[編輯 | 編輯原始碼]

系統安裝使 GLPK 對所有使用者普遍可用,但需要sudo 許可權。系統安裝是可選的,可以省略。

$ tar -xzvf glpk-4.65.tar.gz
$ cd glpk-4.65
$ ./configure
$ sudo make uninstall

解除安裝 GLPK 4.65(如果有)(步驟一和三可能沒有必要)

解除安裝以前版本的 GLPK 並不是嚴格必要的,但這是一個好習慣。

$ sudo make install
Libraries have been installed in: /usr/local/lib

安裝 GLPK 4.65

$ ls -lF /usr/local/lib/libglpk.a
$ ls -lF /usr/local/lib/libglpk.so

檢查預期檔案是否存在

$ which glpsol
/usr/local/bin/glpsol

檢查 GLPSOL 是否普遍可用

$ sudo ldconfig --verbose

更新執行時連結器快取(可能沒有必要)

收尾

[編輯 | 編輯原始碼]

$ make clean          # the Makefile remains, unlike distclean

最後,清理 GLPK 4.65 原始碼目錄

$ cd ~/glpk
$ rm -fr glpk-4.65

並根據需要刪除過時的分支(如果存在,原始的 GLPK 4.65 壓縮包將保留)

就這樣!

[編輯 | 編輯原始碼]

原始碼

[編輯 | 編輯原始碼]

原始碼包含更多關於構建過程的資訊,包括一些有用的配置選項

$ less INSTALL        # q to quit

效能調整

[編輯 | 編輯原始碼]

在 x86 架構上使用 GCC 編譯 GLPK 時,使用選項編譯可以提高 20% 的效能-mfpmath=both。這需要啟用 SSE。這是 x86-64 編譯器的預設設定。對於 32 位編譯器,SSE 必須透過以下任一方式啟用-march=<cpu-type>, -msse,或-msse2.

-mfpmath=both允許使用 FPU 和 SSE 暫存器。參見 http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/i386-and-x86_002d64-Options.html

示例

$ export CFLAGS="-march=native -O3 -pipe -mfpmath=both"
$ ./configure --enable-dl --enable-mysql --enable-odbc
$ make -j8
$ make check
$ sudo make install
$ sudo ldconfig
  • -march=native意味著該程式碼可能無法在不同的 CPU 上使用。
  • -pipe透過使用管道而不是檔案來減少編譯時間
  • -j8透過並行化減少編譯時間,假設有 8 個核心

故障排除

[編輯 | 編輯原始碼]

要查詢系統上的關鍵 GLPK 檔案,請嘗試

$ find -P /usr -name "*glpk.*" \( -type f -o -type l \) -exec file '{}' \; 2>/dev/null

要檢查當前搜尋路徑,請嘗試

$ printenv | grep PATH

以上兩個呼叫都是被動的,不會改變你的系統。

您可能需要顯式更新執行時連結器快取

$ sudo ldconfig --verbose

參考資料

[編輯 | 編輯原始碼]
  1. "Re: Automake's invokation of libtool doesnt handle $prefix with spaces in directory names". Free Software Foundation. Retrieved 10 May 2012.
華夏公益教科書