适用范围:Linux,或通过 Remote - WSL / Remote - SSH 打开的 OpenFOAM 环境。不同 OpenFOAM 发行版的源码目录会变化,配置应基于当前 shell 环境生成,不要复制他人的绝对路径清单。

优先方案:使用编译数据库

VS Code C/C++ 扩展支持 `compile_commands.json`。如果当前构建流程能够生成编译数据库,优先在 `.vscode/c_cpp_properties.json` 中引用它:

1
2
3
4
5
6
7
8
9
{
"configurations": [
{
"name": "OpenFOAM",
"compileCommands": "${workspaceFolder}/compile_commands.json"
}
],
"version": 4
}

编译数据库记录每个翻译单元真实使用的编译器、宏和头文件参数,比维护一份覆盖整个 OpenFOAM 源码树的 `includePath` 更准确。没有匹配条目时,C/C++ 扩展才会回退到下面的基础配置。

回退方案:使用环境变量

先在已经加载 OpenFOAM 环境的终端中确认变量:

1
2
printf 'WM_PROJECT_DIR=%s\nFOAM_SRC=%s\n' "$WM_PROJECT_DIR</span>&quot;</span> <span class="string">&quot;<span class="variable">$FOAM_SRC"
find "$FOAM_SRC" -type d -name lnInclude -print | head

然后从同一个终端启动 VS Code:

1
code /path/to/your/solver

基础配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"env": {
"foamSrc": "$&#123;env:FOAM_SRC&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;foamProject&quot;</span><span class="punctuation">:</span> <span class="string">&quot;${env:WM_PROJECT_DIR}"
},
"configurations": [
{
"name": "OpenFOAM",
"compilerPath": "/usr/bin/g++",
"intelliSenseMode": "linux-gcc-x64",
"cppStandard": "c++17",
"includePath": [
"$&#123;workspaceFolder&#125;/**&quot;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">&quot;${foamSrc}/**",
"$&#123;foamProject&#125;/applications/**&quot;</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;browse&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="string">&quot;${workspaceFolder}",
"$&#123;foamSrc&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">&quot;${foamProject}/applications"
],
"limitSymbolsToIncludedHeaders": true
}
}
],
"version": 4,
"enableConfigurationSquiggles": true
}

递归扫描整个源码树会增加索引时间。实际项目应先根据 `Make/options` 缩小路径范围;只有在尚未取得编译数据库时,才把 `${FOAM_SRC}/**` 当作临时回退。

标准库和第三方库

指定 `compilerPath` 后,扩展会向编译器查询系统头文件路径,通常不必手工复制 `/usr/include` 或 GCC 的版本目录。可用下面的命令检查编译器实际搜索顺序:

1
printf '' | g++ -E -x c++ - -v

第三方库也使用环境变量,不写真实用户目录。例如先设置:

1
export EIGEN_ROOT=/path/to/eigen-3.4.0

再追加:

1
"${env:EIGEN_ROOT}/**"

排错顺序

  1. 确认打开 VS Code 的 shell 已加载 OpenFOAM 环境。
  2. 在命令面板运行 `C/C++: Log Diagnostics`,检查生效的编译器和 include path。
  3. 对照当前目标的 `Make/options`,补充真正缺失的 `-I` 路径和预处理宏。
  4. 若切换 OpenFOAM 版本,删除旧索引缓存并重新加载窗口。
  5. 跳转到错误版本的声明时,检查是否同时索引了两套 OpenFOAM 源码树。

参考