Delft3D 是一款强大的开源水动力模拟软件,但在 Windows 上编译它往往困难重重。本文记录了在 Windows 子系统 (WSL2) 的 Ubuntu 22.04 环境下,从零开始编译 Delft3D 4 TAG 142586 版本的完整过程。本教程修复了因编译器版本过新导致的各种报错(如 sysctl.h 缺失、Fortran 语法错误、MPI 链接失败等)。
第一步:准备 Ubuntu 22.04 环境
为了避开 Ubuntu 24.04 的系统 Bug,强烈建议使用更稳定的 22.04 版本。请在 Windows PowerShell 中运行以下命令安装:
wsl --install -d Ubuntu-22.04
安装完成后,启动 Ubuntu 并设置用户名和密码。
第二步:安装依赖库
编译 Delft3D 需要大量的编译器和依赖库。请复制以下命令在 Ubuntu 终端中运行:
sudo apt update
sudo apt install -y build-essential subversion autoconf libtool bison flex gfortran \
libexpat1-dev libcurl4-openssl-dev libxml2-dev uuid-dev ruby dos2unix \
pkg-config libnetcdf-dev libnetcdff-dev libopenmpi-dev openmpi-bin
第三步:准备源码与格式转换
假设您已经将源码下载到了 Windows 的 F 盘 (F:\delft3dsources)。我们需要将其复制到 Linux 环境中,并转换文件格式(解决 Windows 换行符导致的报错)。
# 1. 复制源码到 Linux 主目录
cp -r /mnt/f/delft3dsources ~/delft3d_src
cd ~/delft3d_src
# 2. 进入核心目录 (确保能看到 autogen.sh)
# 注意:如果您的源码结构不同,请自行 cd 到包含 src 的目录
if [ -d "src" ]; then cd src; fi
# 3. 转换 Windows 换行符为 Linux 格式
find . -name "*.sh" -exec dos2unix {} +
find . -name "configure.ac" -exec dos2unix {} +
find . -name "Makefile.am" -exec dos2unix {} +
chmod +x autogen.sh
第四步:修复代码中的已知 Bug
由于 Delft3D 4 的代码较老,而 Ubuntu 22.04 的编译器较新,直接编译会报错。我们需要对源代码进行三个关键修正:
1. 修复 sysctl.h 缺失问题
新版 Linux 内核已移除该头文件。
find . -name "meminfo.cpp" -exec sed -i 's/#include <sys\/sysctl.h>/\/\/#include <sys\/sysctl.h>/g' {} +
2. 修复 C++ 指针比较错误
修复 server.cpp 中将指针与 0 直接比较的语法错误。
find . -name "server.cpp" -exec sed -i 's/if (spec < 0)/if ((long)spec < 0)/g' {} +
3. 修复 Fortran 逻辑值类型错误
修复 restart_trim_flow.f90 中将逻辑变量与整数 0 比较的错误。
find . -name "restart_trim_flow.f90" -exec sed -i 's/if (has_umean \/= 0)/if (has_umean)/g' {} +
第五步:配置与编译
这是最关键的一步。我们需要在配置时指定 MPI 库的路径,并开启 Fortran 的宽松模式以忽略旧语法的警告。
1. 生成配置文件
./autogen.sh
2. 执行 Configure (配置)
请直接复制以下整行命令:
./configure --prefix=$HOME/delft3d_install \
FCFLAGS="-g -O2 -fallow-argument-mismatch -I/usr/include -I/usr/lib/x86_64-linux-gnu/openmpi/include" \
FFLAGS="-g -O2 -fallow-argument-mismatch -I/usr/include -I/usr/lib/x86_64-linux-gnu/openmpi/include" \
CXXFLAGS="-I/usr/lib/x86_64-linux-gnu/openmpi/include" \
CFLAGS="-I/usr/lib/x86_64-linux-gnu/openmpi/include"
3. 编译与安装
# 使用 4 核并行编译加速
make -j4
# 安装到指定目录
make install
第六步:配置环境变量
安装完成后,需要告诉系统程序在哪里,特别是要通过 LD_PRELOAD 解决 MPI C++ 库丢失的问题。
请运行以下命令将配置写入 .bashrc 文件:
echo 'export PATH=$HOME/delft3d_install/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$HOME/delft3d_install/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
# 关键:强制加载 MPI C++ 接口库
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libmpi_cxx.so' >> ~/.bashrc
# 使配置立即生效
source ~/.bashrc
第七步:验证运行
现在,您可以在终端中输入以下命令进行测试:
d_hydro -v
如果看到版本号输出,说明安装成功!
运行测试算例
如果您有 XML 格式的配置文件(如 config_d_hydro.xml),可以直接运行:
d_hydro config_d_hydro.xml
恭喜!您已成功在 Windows (WSL) 上编译了 Delft3D!
文章评论