计算化学公社

标题: 在 Apple Silicon 芯片上原生编译 Multiwfn 3.8(dev) 的方法及踩坑记录 [打印本页]

作者
Author:
洛兰希尔    时间: 2024-6-1 11:33
标题: 在 Apple Silicon 芯片上原生编译 Multiwfn 3.8(dev) 的方法及踩坑记录
本帖最后由 洛兰希尔 于 2024-6-1 11:49 编辑

在 Apple Silicon 芯片上原生编译 Multiwfn 3.8(dev) 的方法及踩坑记录


注:本文所载方法支持在最新版本的 macOS Sonoma 14.5 使用,但未知是否可以使用 Multiwfn 全部功能。

笔者去年购入了一台 MacBook Air (M2 clip) 以方便在组会上学(mo)习(yu),考虑到 Apple Silicon 系列芯片以及高版本 macOS 的兼容性问题,最初并没有准备在 MacBook 上使用计算化学相关软件的想法。但最近恰好看到了坛友的这一篇帖子:Multiwfn 3.8dev noGUI版本在MacOS的源码安装 - 波函数分析与Multiwfn (Wavefunction Analysis & Multiwfn) - 计算化学公社 (keinsci.com),遂萌生了试试看的想法。尽管上述帖子的编译方法实际上并不困难,但笔者还是踩了不少的坑。因此这些踩坑的记录也一并列在本文中,以供坛友参考。

本文试图让从未接触过 macOS 编译程序的坛友能够成功编译 Multiwfn,但并不代表鼓励 macOS 作为长期使用的操作系统。对于计算化学工作者来说,Linux 仍然是最合适的操作系统。macOS 应当仅仅作为临时使用的选项。

1. Multiwfn 3.8(dev) 的原生编译

这一方法来自于 GitHub 的此仓库:GitHub - digital-chemistry-laboratory/multiwfn-mac-build: A build recipe for Multiwfn on MacOS,你需要将仓库中的 CMakeLists.txt 下载到本地。

本文使用的 shell 环境为 zsh,但应该同样适用于 bash。对于 bash 用户,后续对 ~/.zshrc 的修改相应替换为 ~/.bashrc

注:macOS Mojave 10.14 及更新的系统默认的 shell 环境应当已经更改为 zsh。如果你不确定你的 shell 环境,在终端中输入 echo $0 查看。

1.1 准备工作

在开始之前,你需要确保你已经安装了 macOS 的包管理器 Homebrew、版本控制工具 git,这两者一般已经预装在 macOS 中。

你需要这些依赖项:GCCOpenBLASCMakearbflint。在终端中使用 Homebrew 安装的方法为:
  1. <span style="background-color: white;">brew install [Packname]</span>
复制代码
请注意,arb 已经合并到 flint-3.0.0 中,因此你可能遇到 Homebrew 提示你包不存在的问题。如果你参考这个提示只安装了 flint ,仍然可能在后续编译过程中遇到缺少各种 .h 头文件的错误提示。对于这种情况,请查看本文最后面的踩坑记录。

由于 Apple Silicon 的原因,默认使用的是 Apple 的 BLAS/LAPACK 而非 OpenBLAS。你需要在 ~/.zshrc 中加入以下内容使用 OpenBLAS
  1. export LDFLAGS="-L/opt/homebrew/opt/openblas/lib"
  2. export PKG_CONFIG_PATH="/opt/homebrew/opt/openblas/lib/pkgconfig"
复制代码

上述两个路径可通过 brew list openblas 得到,请将双引号内的路径替换为你的实际路径。如果你找不到 ~/.zshrc,在你的用户根目录下按组合键 Command + Shift + . 显示隐藏文件。

1.2 编译 Multiwfn

本文使用的 Multiwfn 3.8(dev) 源代码发布时间为 May 31, 2024。如果你编译其他日期发布的 Multiwfn 源代码遇到问题,可先尝试本版本排除准备工作遗漏的问题。

将 Multiwfn 的源代码(发布页面上的 Multiwfn_3.8_dev_src_Linux)解压到你喜欢的路径,将本文提供的 CMakeLists.txt 复制到文件夹中。下文假设解压到了 Documents/Multiwfn-3.8_dev_src_Linux,在终端中输入:
  1. cd Documents/Multiwfn-3.8_dev_src_Linux  # 进入目录
  2. cmake -B build                           # 构建编译目录
  3.                                          # 在当前目录下生成 build 文件夹
  4. cmake --build build                      # 在 build 文件夹下编译
复制代码

这样做得到的 Multiwfn 可执行文件没有被编译器执行优化,但编译速度更快,更加适合第一次尝试编译或排查问题使用。当你使用上述方法成功编译后,应当使用 Release 生成。无需退出终端,输入:
  1. rm -rf build                               # 删除生成文件
  2. cmake -B build -DCMAKE_BUILD_TYPE=Release  # 构建编译目录,编译类型为 Release
  3.                                            # 编译器会自动优化,但编译时间更久
  4. cmake --build build                        # 编译
复制代码

补充一点,cmake -B 可以携带如下参数:
  1. -DCMAKE_BUILD_TYPE=Release  # 指定编译类型为 Release
  2. -DWITH_OpenMP=ON            # 使用 OpenMP 进行构建,使用 Apple Clang 时会报错
复制代码

Apple Silicon 缺少 DISLIN 包,因此不支持编译带有 GUI 的版本,此处因此略去 GUI 版本的编译流程。如果你是 Intel 芯片的 Mac,可以参照本文给出的仓库地址自行尝试编译。

上述流程完成后,将编译得到的 multiwfn 可执行文件放到你喜欢的地方,下文假设复制到了 Documents/Multiwfn。在 ~/.zshrc 中加入如下内容:
  1. # Multiwfn
  2. export PATH=$PATH:"$HOME/Documents/Multiwfn"
  3. export Multiwfnpath="$HOME/Documents/Multiwfn"
复制代码

重新进入终端,输入 multiwfn。如果你看到了和下图类似的提示,恭喜你,你已经成功安装了 Multiwfn!

(, 下载次数 Times of downloads: 45)

Enjoy it!
2. 踩坑记录和常见问题

不得不说,在 Apple Silicon 的 macOS 下编译 Multiwfn 确实是一件很心累的事情,这个过程中确实存在太多兼容性问题。后面是笔者在编译过程中遇到的一些问题以及解决方法。

2.1 编译过程中提示缺少 arb 包相关的 .h 头文件

使用 Homebrew 安装 arb 包时提示已经合并到了 flint 包中,但是安装完 flint 包后编译仍然提示缺少头文件。检查后发现是 flint 包当前版本不含 arb。这……

最简单的解决方法是去 arb 的官方仓库下载一份并且将其复制到 Multiwfn 源码包的 etc 文件夹下。仓库地址:GitHub - flintlib/arb: Arb has been merged into FLINT -- usehttps://github.com/flintlib/flint/

也可以自行 git clont/opt/homebrew/Cellar/(改为你的 Homebrew 安装的实际地址),然后使用 brew link arb 命令手动添加。

2.2 使用 OpenMP 时构建生成目录报错

可能原因是你使用了默认的 Clang 编译器而非 GCC,解决方法是在 CMakeLists.txt 文件开头加入以下内容:
  1. set(CMAKE_C_COMPILER "/usr/bin/gcc")
  2. set(CMAKE_CXX_COMPILER "/usr/bin/g++")
复制代码

上述路径应当使用你的 GCC 路径,可通过 brew list gcc 查看。

2.3 使用 GUI

根据仓库内的项目说明,由于 DISLIN 不支持 Apple Silicon,因此目前无法使用 Multiwfn 的 GUI。

笔者在查看 DISLIN 的下载页面后发现提供了 ARM 的版本,但编译完成后仍然不可用 GUI,其窗口为空白,强行使用将报错:
  1. #0 0x11b790aae
  2. #1 0x11b78fc8d
  3. #2 0x7ff800b0537c
  4. #3 0x103ccb3d5
  5. #4 0x103398bb9
  6. #5 0x103aed80c
  7. #6 0x103d8c754
  8. #7 0x10306027f
  9. #8 0x103065aa6
  10. #9 0x7ff80074c385
  11. zsh: segmentation fault
复制代码

目前尚未找到解决方法。

2.4 已经正确部署环境但编译出错

Apple Silicon 的 Mac 不支持使用 ifortifx 这两种 Intel Fortran 编译器,只能使用 gfortran

两种编译器对代码的要求不同(gfortran 似乎更严格),因此可能导致报错,遇到该问题请联系社长解决。

(笔者遇到该问题向社长询问后,社长在半小时后就更新了源代码,此种责任心令人仰慕!)

3. 总结

不得不说,在 macOS 上试图运行计算化学程序是一件极为愚蠢的决定。如非必要,还是尽可能去 Windows 或者 Linux 下用吧。希望本文能帮到一些确有需求在 macOS 上运行 Multiwfn 的人,也希望更多朋友不要主动踩坑。

珍爱时间,远离 mac!

附:本文使用的 CMakeList 文件: (, 下载次数 Times of downloads: 3)


作者
Author:
wangzhe    时间: 2024-6-1 11:37
其实不用那么麻烦,用CrossOver跑Windows版的Multiwfn就行。。。
作者
Author:
洛兰希尔    时间: 2024-6-1 11:38
wangzhe 发表于 2024-6-1 11:37
其实不用那么麻烦,用CrossOver跑Windows版的Multiwfn就行。。。

确实是这样的,但是我的丐版 MacBook 跑虚拟机实在是有点艰难
作者
Author:
wangzhe    时间: 2024-6-1 13:02
洛兰希尔 发表于 2024-6-1 12:38
确实是这样的,但是我的丐版 MacBook 跑虚拟机实在是有点艰难

CrossOver不是虚拟机,是一个基于Wine的可以在macOS上直接运行Windows程序的平台。
由于不需要另行安装Windows,运行起来和原生mac程序一样,不吃配置。
作者
Author:
洛兰希尔    时间: 2024-6-1 16:44
wangzhe 发表于 2024-6-1 13:02
CrossOver不是虚拟机,是一个基于Wine的可以在macOS上直接运行Windows程序的平台。
由于不需要另行安装W ...

原来如此,后面我学习一下




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3