跳到内容

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.
华夏公益教科书