本帖最后由 洛兰希尔 于 2024-6-1 11:49 编辑
在 Apple Silicon 芯片上原生编译 Multiwfn 3.8(dev) 的方法及踩坑记录
注:本文所载方法支持在最新版本的 macOS Sonoma 14.5 使用,但未知是否可以使用 Multiwfn 全部功能。
本文试图让从未接触过 macOS 编译程序的坛友能够成功编译 Multiwfn,但并不代表鼓励 macOS 作为长期使用的操作系统。对于计算化学工作者来说,Linux 仍然是最合适的操作系统。macOS 应当仅仅作为临时使用的选项。
1. Multiwfn 3.8(dev) 的原生编译
本文使用的 shell 环境为 zsh,但应该同样适用于 bash。对于 bash 用户,后续对 ~/.zshrc 的修改相应替换为 ~/.bashrc。
注:macOS Mojave 10.14 及更新的系统默认的 shell 环境应当已经更改为 zsh。如果你不确定你的 shell 环境,在终端中输入 echo $0 查看。
1.1 准备工作
在开始之前,你需要确保你已经安装了 macOS 的包管理器 Homebrew、版本控制工具 git,这两者一般已经预装在 macOS 中。
你需要这些依赖项:GCC,OpenBLAS,CMake,arb,flint。在终端中使用 Homebrew 安装的方法为: - <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: - export LDFLAGS="-L/opt/homebrew/opt/openblas/lib"
- 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,在终端中输入: - cd Documents/Multiwfn-3.8_dev_src_Linux # 进入目录
- cmake -B build # 构建编译目录
- # 在当前目录下生成 build 文件夹
- cmake --build build # 在 build 文件夹下编译
复制代码
这样做得到的 Multiwfn 可执行文件没有被编译器执行优化,但编译速度更快,更加适合第一次尝试编译或排查问题使用。当你使用上述方法成功编译后,应当使用 Release 生成。无需退出终端,输入: - rm -rf build # 删除生成文件
- cmake -B build -DCMAKE_BUILD_TYPE=Release # 构建编译目录,编译类型为 Release
- # 编译器会自动优化,但编译时间更久
- cmake --build build # 编译
复制代码
补充一点,cmake -B 可以携带如下参数: - -DCMAKE_BUILD_TYPE=Release # 指定编译类型为 Release
- -DWITH_OpenMP=ON # 使用 OpenMP 进行构建,使用 Apple Clang 时会报错
复制代码
Apple Silicon 缺少 DISLIN 包,因此不支持编译带有 GUI 的版本,此处因此略去 GUI 版本的编译流程。如果你是 Intel 芯片的 Mac,可以参照本文给出的仓库地址自行尝试编译。
上述流程完成后,将编译得到的 multiwfn 可执行文件放到你喜欢的地方,下文假设复制到了 Documents/Multiwfn。在 ~/.zshrc 中加入如下内容: - # Multiwfn
- export PATH=$PATH:"$HOME/Documents/Multiwfn"
- export Multiwfnpath="$HOME/Documents/Multiwfn"
复制代码
重新进入终端,输入 multiwfn。如果你看到了和下图类似的提示,恭喜你,你已经成功安装了 Multiwfn!
Enjoy it! 2. 踩坑记录和常见问题
不得不说,在 Apple Silicon 的 macOS 下编译 Multiwfn 确实是一件很心累的事情,这个过程中确实存在太多兼容性问题。后面是笔者在编译过程中遇到的一些问题以及解决方法。
2.1 编译过程中提示缺少 arb 包相关的 .h 头文件
使用 Homebrew 安装 arb 包时提示已经合并到了 flint 包中,但是安装完 flint 包后编译仍然提示缺少头文件。检查后发现是 flint 包当前版本不含 arb。这……
也可以自行 git clont 到 /opt/homebrew/Cellar/(改为你的 Homebrew 安装的实际地址),然后使用 brew link arb 命令手动添加。
2.2 使用 OpenMP 时构建生成目录报错
可能原因是你使用了默认的 Clang 编译器而非 GCC,解决方法是在 CMakeLists.txt 文件开头加入以下内容: - set(CMAKE_C_COMPILER "/usr/bin/gcc")
- set(CMAKE_CXX_COMPILER "/usr/bin/g++")
复制代码
上述路径应当使用你的 GCC 路径,可通过 brew list gcc 查看。
2.3 使用 GUI
根据仓库内的项目说明,由于 DISLIN 不支持 Apple Silicon,因此目前无法使用 Multiwfn 的 GUI。
笔者在查看 DISLIN 的下载页面后发现提供了 ARM 的版本,但编译完成后仍然不可用 GUI,其窗口为空白,强行使用将报错: - #0 0x11b790aae
- #1 0x11b78fc8d
- #2 0x7ff800b0537c
- #3 0x103ccb3d5
- #4 0x103398bb9
- #5 0x103aed80c
- #6 0x103d8c754
- #7 0x10306027f
- #8 0x103065aa6
- #9 0x7ff80074c385
- zsh: segmentation fault
复制代码
目前尚未找到解决方法。
2.4 已经正确部署环境但编译出错
Apple Silicon 的 Mac 不支持使用 ifort 或 ifx 这两种 Intel Fortran 编译器,只能使用 gfortran。
两种编译器对代码的要求不同(gfortran 似乎更严格),因此可能导致报错,遇到该问题请联系社长解决。
(笔者遇到该问题向社长询问后,社长在半小时后就更新了源代码,此种责任心令人仰慕!)
3. 总结
不得不说,在 macOS 上试图运行计算化学程序是一件极为愚蠢的决定。如非必要,还是尽可能去 Windows 或者 Linux 下用吧。希望本文能帮到一些确有需求在 macOS 上运行 Multiwfn 的人,也希望更多朋友不要主动踩坑。
珍爱时间,远离 mac!
附:本文使用的 CMakeList 文件:
CMakeLists.txt
(2.21 KB, 下载次数 Times of downloads: 3)
|