ユーザーガイド 1.5系 - 3.2 アプリケーションやライブラリのコンパイル
出典: OFWikiJa
[編集] 3.2 アプリケーションやライブラリのコンパイル
コンパイルはアプリケーションの開発には必要不可欠の部分であり,各々のコードのピースがそれ自身,OpenFOAMのライブラリに依存しているコンポーネントに アクセスすることから,細心の管理が必要となります。多くの場合、これらの構築はUNIX/Linuxシステムでは標準のUNIX makeユーティティを使ってコンパイルします。しかしながら、OpenFOAMはより用途が広く簡便性に優れている,wmakeでのコンパイルスクリプトを提供しています。 実際、wmakeはOpenFOAMのライブラリだけでなく、どのコードにも使われています。 コンパイルのプロセスを理解するために,最初にC++のある側面とそのファイル構成について図3.1で説明します。クラスとは、オブジェクトの構築様式,データの格納およびクラスのメンバー関数のような命令文のセットで定義されるものです。クラスの定義を含むファイルは.Cの拡張子を持っており,例えばクラスncであればファイルnc.C.と書かれます。このファイルは,他のコードとは独立にコンパイルしてnc.soのような拡張子.soを持つオブジェクトライブラリーとして知られるバイナリ実行ライブラリファイルとすることができます。 コードの一部を、仮にnewApp.Cなどとしてコンパイルする時,ユーザーはncクラスを使うことにより,nc.Cを再コンパイルしなくてもランタイムとしてnewApp.Cでnc.soを呼び出せば良いことになります。これがダイナミックリンクといわれるものです。
図3.1: ヘッダーファイル、ソースファイル、コンパイル、リンク
[編集] 3.2.1 ヘッダーH.ファイル
エラーチェックをおこなうにあたって、コンパイルするコードの部分がどのクラスで用いられるか、また実際の操作でどのように振舞うかを認識しなければなりません。 それゆえ、(例えばnc.Hのような).Hファイル拡張子を持つヘッダーファイルによってクラス宣言が必要です。このようなヘッダーファイルにはクラス名とその機能が表記されています。
このファイルは,クラスを用いるあらゆるコード(クラス宣言のためのコードも含め)の最初の部分に置きます。 .Cコードではどの部分でいくつのクラスを用いてもかまいませんが、かならずクラス宣言のために.Hファイルではじめる必要があります。クラスは他のクラスのリソースとして使うことができますが、その場合も関連付けた.Hファイルではじめます。 クラスヒエラルキーを再帰的に検索することで、結局、上位.Cコードが依存しているクラス(これらの.Hファイルはdependencyと呼ばれる)で、すべてのクラスに関するヘッダーファイルのリストをコンパイルすることができます。dependencyリストがあればコンパイラはソースファイルが最終コンパイル以来アップデートされているかどうかチェックでき、選択的に必要な部分だけコンパイルできます。
ヘッダーファイルは、例えば
# include "otherHeader.H";
のような# include命令文を使ったコードに含まれていますが、このようなコードはコンパイラに特定のファイルを読ませるために現在のファイルの読み込みを一時中断させます。 すべての内蔵コードはヘッダーファイルに入れること、コード可読性を高めるためにメインコードにrelevant locationに含めることができます。 例えば多くのOpenFOAMアプリケーションでは、作成フィールドや読み込みフィールドの入力データのコードはコードの始めにcreateFields.Hと名づけられたファイルに含まれます。この方法では,ヘッダーファイルは単独でクラスの宣言として使われるだけではありません。以下のようなその他の機能と共に依存リストファイルを維持管理するタスクを実行するのがWMAKEなのです。
- ソースファイルと,それらが依存しているファイルの依存関係リストの自動作成と管理
- マルチ・プラットフォームコンパイル適切なディレクトリ構造を通じてハンドルされたマルチプラットフォームでのコンパイルとリンク
- マルチ・ランゲージコンパイルとCやC++やJava等のリンケージ
- CやC++,Javaのようなマルチ言語でのコンパイルとリンク
- デバッグや最適化,並列処理,分析といったマルチオプションでのコンパイルとリンク
- ソースコードの作成プログラムのサポート,lex, yacc, IDL, MOC
- ソースファイルリストの簡潔なシンタックス
- 新規のコードリストのソースファイルリストの自動生成
- 多重分割あるいは静的ライブラリの簡潔なハンドリング
- 新しいタイプのマシンへの拡張性
- make; sh, ksh or csh; lex, ccを持ついかなるマシンでの作業に対する優れた移植性
- Apollo, SUN, SGI, HP (HPUX), Compaq (DEC), IBM (AIX), Cray,Ardent,Stardent, PC Linux, PPC Linux, NEC, SX4, Fujitsu VP1000で の動作確認
[編集] 3.2.2 wmakeによるコンパイル
OpenFOAMのアプリケーションは各アプリケーションのソースコードがそのアプリケーション名のディレクトリに置かれるという一般的決まりで編成されます。最上位ソースファイルはアプリケーション名に拡張子.Cをつけます。例えば、newAppというアプリケーションのソースコードは図3.2に示すようにnewAppのディレクトリに存在し、最上位ファイルはnewApp.C となります。
図3.2: アプリケーションのディレクトリ構成
ディレクトリはoptionsとfilesのふたつのファイルを含んだMakeというサブディレクトリも持っており、それについては次節で述べます。
[編集] 3.2.2.1 ヘッダーのインクルード
コンパイラは、以下の順でwmakeで-Iオプションが指定されたヘッダーファイルを検索します。
- $WM_PROJECT_DIR/src/OpenFOAM/lnInclude ディレクトリ
- newApp/lnIncludeのようなローカルディレクトリ
- newAppのようなローカルディレクトリ
- /usr/X11/include and $(MPICH_ARCH_PATH)/includeのように,プラットフォームに依存する$WM_PROJECT_DIR/wmake/rules/$WM_ARCH/ディレクトリの中のファイルに設定されているパス
- -Iオプションを持つMake/optionsファイルの中で明確に指定されている他のディレクトリ
Make/optionsファイルは構文を使っているヘッダーファイルを配置するためのフルディレクトリパスを含みます。
EXE_INC = \
-I<directoryPath1> \
-I<directoryPath2> \
... \
-I<directoryPathN>
ディレクトリ名は頭に-Iをつけ、各行ではEXE_INCを続けるために構文は\を使い、最終記入後は\をつけないことに注意してください。
[編集] 3.2.2.2 ライブラリへのリンク
コンパイラは、以下のwmakeの-Lオプションで指定されたディレクトリパスのオブジェクトライブラリファイルにリンクします。
- $FOAM_LIBBIN ディレクトリ
- $WM_DIR/rules/$WM_ARCH/デイレクトリの中に設定された機種に依存するパス,例えば,/usr/X11/や$(MPICH_ARCH_PATH)/lib
- Make/optionsファイルで指定された他のディレクトリ
リンクされる実際のライブラリファイルは-lオプションで指定し,接頭辞lib,ライブラリファイルの拡張子.soをを外さなければなりません。例えばライブラリlibnew.soはフラグ-lnewに含まれます。
デフォルトでは,wmakeは以下のライブラリをロードするようになっています
- $FOAM_LIBBINディレクトリからのlibOpenFOAM.soライブラリ;
- $WM_DIR/rules/$WM_ARCH/ディレクトリの中のファイルに設定された機種に依存するライブラリ,例えば,/usr/X11/libにおけるlibm.soや,$(LAM ARCH PATH)/libにおけるliblam.so;
- Make/optionsファイルで指定された他のライブラリ
Make/optionsファイルは構文を使っているヘッダーファイルを置くための全ディレクトリパスを含みます。
EXE_LIBS = \
-L<libraryPath1> \
-L<libraryPath2> \
... \
-L<libraryPathN> \
-l<library1> \
-l<library2> \
... \
-l<libraryN>
繰り返しになりますが、ディレクトリパスは頭に-Lフラグを付け、ライブラリ名は頭に-lフラグをつけます。
[編集] 3.2.2.3 コンパイルすべきソースファイル
コンパイラはコンパイルすべき.Cソースファイルのリストが必要です。リストはメインの.Cファイルだけではなく特定のアプリケーションのために生成されるがクラスライブラリの中に含まれない他のソースファイルも含まれなければなりません。 例えば、新しいクラスを作成したり、特定のアプリケーション用のクラスに新しい機能をつけくわえることができます。.CソースファイルのフルリストはMake/filesファイルに含む必要があります。当然、アプリケーションは多くなるので、フルリストには(例えば前述のアプリケーション例におけるnewApp.Cのような)メイン.Cファイルの名前だけを入れます。 Make/filesファイルはEXE =構文によって指定されたコンパイル済み実行ファイルの名前とフルパスも含みます。一般的な決まりでは"newApp"のようにアプリケーション名をつけることが規定されています。OpenFOAMのリリースにはパスのために便利な2つの選択肢があります。標準的なリリースではアプリケーションは$FOAM_APPBINに保存されますが、ユーザーにより開発されたアプリケーションは$FOAM_USER_APPBINに保存されます。
もしアプリケーションを開発したら、個人のOpenFOAMアプリケーションのためのソースコードを含む$WM_PROJECT_USER_DIRディレクトリにアプリケーションサブディレクトリを作ることをお薦めします。スタンダードアプリケーションと同様に各OpenFOAMアプリケーションのソースコードも各ディレクトリ内に保存しておいてください。ユーザーアプリケーションとスタンダードリリースのものの違いはMake/filesファイルが$FOAM_USER_APPBINディレクトリ内に書き込まれている実行可能ファイルを指定していることだけです。例としてのMake/filesを以下に記載します。
newApp.C EXE = $(FOAM_USER_APPBIN)/newApp
[編集] 3.2.2.4 wmakeの実行
wmakeのスクリプトは以下のように入力することで実行されます。
wmake <optionalArguments> <optionalDirectory>
<optionalDirectory>はコンパイル中のアプリケーションのディレクトリパスです。通常、<optionalDirectory>が省略可能な場合にはwmakeはコンパイル中のアプリケーションのディレクトリ内から実行されます。
アプリケーションファイルを作成したい場合には<optionalArguments>は必要ありません。しかし<optionalArguments>は表3.1に示すようにライブラリ等の作成の際には指定されることになります。
| Argument | 編集の種類 |
| lib | 静的にリンクされたライブラリの作成 |
| libso | 動的にリンクされたライブラリの作成 |
| libo | 静的にリンクされたオブジェクトファイルライブラリの作成 |
| jar | JAVAアーカイブの作成 |
| exe | 特定のプロジェクトライブラリから独立したアプリケーションの作成 |
表3.1: wmakeのオプション編集Argument.
[編集] 3.2.2.5 wmakeの環境変数
参考として、wmakeで使われる環境変数の設定を表3.2に示します。
| 主なパス | |
| $WM_PROJECT_INST_DIR | インストールディレクトリへのフルパス 例:$HOME/OpenFOAM |
| $WM_PROJECT | コンパイルされたプロジェクトの名前: OpenFOAM |
| $WM_PROJECT_VERSION | コンパイルされたプロジェクトのバージョン: 1.5 |
| $WM_PROJECT_DIR | OpenFOAMのバイナリ実行ファイル置き場へのフルパス 例:$HOME/OpenFOAM/OpenFOAM-1.5 |
| $WM_PROJECT_USER_DIR | ユーザーのバイナリ実行ファイル置き場へのフルパス 例:$HOME/OpenFOAM/${USER}-1.5 |
| その他のパスと設定 | |
| $WM_ARCH | マシン構造: cray decAlpha dec ibm linux linuxPPC sgi3 sgi32 sgi64 sgiN32 solaris sx4 t3d |
| $WM_COMPILER | 使用するコンパイラ: Gcc3 - gcc 4.1.2, KAI - KAI |
| $WM_COMPILER_DIR | コンパイラインストールディレクトリ |
| $WM_COMPILER_BIN | コンパイラインストールバイナリ $WM_COMPILER_BIN/bin |
| $WM_COMPILER_LIB | コンパイラインストールライブラリ $WM_COMPILER_BIN/lib |
| $WM_COMPILE_OPTION | コンパイルオプション: Debug - debugging, Opt optimisation. |
| $WM_DIR | wmakeディレクトリのフルパス |
| $WM_JAVAC_OPTION | JAVAのためのコンパイルオプション: Debug - debugging, Opt optimisation. |
| $WM_LINK_LANGUAGE | ライブラリや実行ファイルのリンクに使うコンパイラ。多言語プロジェクトにおいて$WM_LINK_LANGUAGEは主要言語を決める。 |
| $WM_MPLIB | 並列通信ライブラリ: LAM, MPI, MPICH, PVM |
| $WM_OPTIONS | = $WM_ARCH$WM_COMPILER... ...$WM_COMPILE_OPTION$WM_MPLIB 例:linuxGcc3OptMPICH |
| $WM_PROJECT_LANGUAGE | プロジェクトのプログラミング言語 例:c++ |
| $WM_SHELL | wmakeスクリプト(bash, csh, ksh, tcsh)に使うシェル |
表3.2: wmakeの環境変数の設定
[編集] 3.2.3 依存リストの削除:wcleanとrmdepall
実行に際して,例題におけるnewApp.depのように,wmakeは拡張子として.depを持った依存関係のリストファイルを構築し,Make/$WM_OPTIONSディレクトリの中にファイルのリストを格納します。コードを変更してmakeした後などこれらファイルを除去したい場合には,wcleanを入力してスクリプトを実行します。
wclean <optionalArguments> <optionalDirectory>
さらに、<optionalDirectory>はコンパイルされるアプリケーションのディレクトリへのパスです。通常、パスが省略できる場合にはwcleanはアプリケーションのディレクトリ範囲内で実行されます。 もしMakeディレクトリから依存ファイルとファイルを削除したい場合には、<optionalArguments>は必要ありません。しかしもしlibが <optionalArguments> に指定されていたらローカルのInIncludeディレクトリも削除される必要があります。
追加のスクリプト,rmdepallは実行時に、再帰的にディレクトリツリー下の依存関係にあるすべての.depファイルを除去します。これはOpenFOAMのライブラリが更新された時には有効な方法です。
[編集] 3.2.4 コンパイルの例:turbFoamアプリケーション
アプリケーションturbFoamのソースコードは$FOAM_APP/solvers/turbFoamディレクトリ内にあり、最上位ソースファイルはturbFoam.Cという名前です。turbFoam.Cソースコードは
1 /*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
6 \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9 This file is part of OpenFOAM.
10
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
15
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
25 Application
26 turbFoam
27
28 Description
29 Transient solver for incompressible, turbulent flow.
30
31 \*---------------------------------------------------------------------------*/
32
33 #include "fvCFD.H"
34 #include "incompressible/singlePhaseTransportModel/singlePhaseTransportModel.H"
35 #include "incompressible/turbulenceModel/turbulenceModel.H"
36
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
38
39 int main(int argc, char *argv[])
40 {
41
42 # include "setRootCase.H"
43
44 # include "createTime.H"
45 # include "createMesh.H"
46 # include "createFields.H"
47 # include "initContinuityErrs.H"
48
49 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
50
51 Info<< "\nStarting time loop\n" << endl;
52
53 for (runTime++; !runTime.end(); runTime++)
54 {
55 Info<< "Time = " << runTime.timeName() << nl << endl;
56
57 # include "readPISOControls.H"
58 # include "CourantNo.H"
59
60 // Pressure-velocity PISO corrector
61 {
62 // Momentum predictor
63
64 fvVectorMatrix UEqn
65 (
66 fvm::ddt(U)
67 + fvm::div(phi, U)
68 + turbulence->divR(U)
69 );
70
71 if (momentumPredictor)
72 {
73 solve(UEqn == -fvc::grad(p));
74 }
75
76 // --- PISO loop
77
78 for (int corr=0; corr<nCorr; corr++)
79 {
80 volScalarField rUA = 1.0/UEqn.A();
81
82 U = rUA*UEqn.H();
83 phi = (fvc::interpolate(U) & mesh.Sf())
84 + fvc::ddtPhiCorr(rUA, U, phi);
85
86 adjustPhi(phi, U, p);
87
88 // Non-orthogonal pressure corrector loop
89 for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
90 {
91 // Pressure corrector
92
93 fvScalarMatrix pEqn
94 (
95 fvm::laplacian(rUA, p) == fvc::div(phi)
96 );
97
98 pEqn.setReference(pRefCell, pRefValue);
99 pEqn.solve();
100
101 if (nonOrth == nNonOrthCorr)
102 {
103 phi -= pEqn.flux();
104 }
105 }
106
107 # include "continuityErrs.H"
108
109 U -= rUA*fvc::grad(p);
110 U.correctBoundaryConditions();
111 }
112 }
113
114 turbulence->correct();
115
116 runTime.write();
117
118 Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
119 << " ClockTime = " << runTime.elapsedClockTime() << " s"
120 << nl << endl;
121 }
122
123 Info<< "End\n" << endl;
124
125 return(0);
126 }
127
128
129 // ************************************************************************* //
コードはアプリケーションを説明している記述で始まり,この中で1行のコメントは(//)で,複数行に渡るコメントは($\backslash$*...*/)で記述されます。それに続き、コードはコンパイラに現在のファイルの読み込みを一時停止させ、turbFoam.CにfvCFD.Hを読み込ませるための例えば#include "fvCFD.H"のような様々な# include 命令文を含んでいます。
turbFoamはCFDツール(cfdTools)やincompressibleRASModelsやincompressibleTransportModelsライブラリを提供し、それゆえEXE_INC = -I... オプションとライブラリにリンクするEXE LIBS = -l...オプションにより指定されるヘッダーファイルが必要となります。Make/optionsはそれゆえ以下のようになります。
1 EXE_INC = \ 2 -I$(LIB_SRC)/finiteVolume/lnInclude \ 3 -I$(LIB_SRC)/turbulenceModels \ 4 -I$(LIB_SRC)/transportModels 5 6 EXE_LIBS = \ 7 -lincompressibleTurbulenceModels \ 8 -lincompressibleTransportModels \ 9 -lfiniteVolume \ 10 -lmeshTools 11
turbFoamはturbFoam.Cソースしか含みまず、実行ファイルはすべての標準的なアプリケーションと同様に$FOAM_APPBINに書き込まれます。Make/filesはそれゆえ以下のようになります。
1 turbFoam.C 2 3 EXE = $(FOAM_APPBIN)/turbFoam
$FOAM_CFD/turbFoamディレクトリでwmakeとタイプすればturbFoamをコンパイルできます。
コードはコンパイルされ以下のようなメッセージをが作成されます。
Making dependency list for source file turbFoam.C SOURCE_DIR=. SOURCE=turbFoam.C ; g++ -DFOAM_EXCEPTION -Dlinux -DlinuxOptMPICH -DscalarMachine -DoptSolvers -DPARALLEL -DUSEMPI -Wall -O2 -DNoRepository -ftemplate-depth-17 -I/export/warhol/chris/OpenFOAM/OpenFOAM-1.4/src/OpenFOAM/lnInclude -IlnInclude -I. …… -lmpich -L/usr/X11/lib -lm -o /export/warhol/chris/OpenFOAM/OpenFOAM-1.4/applications/bin/linuxOptMPICH/turbFoam
再コンパイルすることも可能ですが、実行ファイルが最新でコンパイルする必要がないというときには以下のようなメッセージが返ってきます。
make: Nothing to be done for `allFiles'. make: `Make/linuxOptMPICH/dependencies' is up to date. make: `/export/warhol/chris/OpenFOAM/OpenFOAM-1.4/applications/bin/linuxOptMPICH/turbFoam' is up to date.
wclean
を使って依存リストを削除し、wmakeを起動することでゼロからアプリケーションをコンパイルできます。
[編集] 3.2.5 デバッグメッセージと最適化スイッチ
OpenFOAMは実行時に書き込まれるメッセージの出力システムを提供しており,このことにより,OpenFOAMのcaseの実行時に出会うデバッグの問題の解決に有効です。 スイッチは$WM_PROJECT_DIR/.OpenFOAM-1.3/controlDictファイルの 中にあり、設定を変更したい場合には,$HOMEディレクトリに(例えば$HOME/.OpenFOAM-1.3/controlDictファイルのように)コピーを作成します。スイッチが可能なリストは非常に多く,foamDebugSwitchesアプリケーションを実行することにより閲覧できます。スイッチのほとんどは,クラスまたは機能性のレンジと一致しており,設定を1にすることにより,controlDictファイルの中にあるそれ自身により変更できます。例えば,OpenFOAMでは,dimensionSetスイッチを1に設定することにより,すべての計算におけるディメンションをチェックする機能があります。表3.3に示すものはより高機能にメッセージをコントロールできるスイッチです。
加えて,いくつかのオペレーションと最適化をコントロールするスイッチがあります。これらのスイッチについても図3.3に示します。特に重要なものはfileModificationSkewであり,OpenFOAMでは,変更をチェックするためにデータファイルの書き込み時間をスキャンしています。異なるマシンでクロックの設定に不整合が生じた状態でNFSを実行すると,先駆けしてフィールドデータの修正が表示されます。このことは,OpenFOAMが新規に修正されたとしてファイルを閲覧する場合と,このデータを再読み込みしようとする場合には問題を引き起こすことになります。キーワードileModificationSkewは秒単位の時間であり,OpenFOAMは,ファイルが新しく修正されたかどうか調べる時には,ファイルの書き込み時間から差し引きます。
| ハイレベルデバッグスイッチ - サブ辞書 DebugSwitches | |
| level | OpenFOAMのデバッグメッセージの全体のレベル - - 0, 1, 2の3レベル |
| lduMatrix | 実行中のソルバの収束メッセージ - 0, 1, 2の3レベル |
| 最適化スイッチ - サブ辞書 OptimisationSwitches | |
| fileModificationSkew | NFSの上でNFSのアップデートの最大遅れとOpenFOAM実行のための差分クロックより長く設定すべき時間(秒)。 |
| nProcsSimpleSum | 並列処理のために全領域の和を最適化します。階層和は線形和(デフォルトで16)よりよく機能し、プロセッサの数を設定します。 |
表3.3: ランタイムメッセージスイッチ
[編集] 3.2.6 現在のアプリケーションへの新しいユーザー定義ライブラリのリンク
タイトルのような状況は、新しいライブラリ(例えば"new"を)作成する時、新しい宣言およびアプリケーションのレンジを越えてライブラリの中に入れ込みたい場合に生じることが考えられます。例えば,ユーザーが新規の境界条件を作成し,newの中でコンパイルし,ソルバーのアプリケーションや,プリおよびポスト・プロセス用のユーティリティ,メッシュツール等々の範囲で認識させる必要があることがあります。通常の環境下では,ユーザーはすべてのアプリケーションを,リンクさせるためにnewで再コンパイルする必要があります。代わりに,OpenFOAMは再コンパイルの必要性を評価するためにfoamUserと呼ばれる特別なライブラリを用いています。これはデフォルトにより,最初に各アプリケーションの中にコンパイルされたfoamUserライブラリをもたせることにより有効になります。foamUserライブラリは,$FOAM_SRC/foamUserのディレクトリの中にあるコードからコンパイルされます。ユーザーが行うことは,foamUserと再コンパイルされたfoamUserのMake/optionsファイルの中にリンクされたライブラリにnewライブラリを追加するだけです。
前述の例の場合であれば、ユーザーはformUserディレクトリのローカルコピーを作り、例えば以下のようなディレクトリに移してください。
cp -r $WM_PROJECT_DIR/src/foamUser $WM_PROJECT_USER_DIR/applications cd $WM_PROJECT_USER_DIR/applications/foamUser
このfoamUserライブラリを$FOAM_USER_LIBBINの中にローカルにコンパイルするように,Make/filesのファイルを次のように修正しましょう
libfoamUser.C LIB = $(FOAM_USER_LIBBIN)/libfoamUser
新しいライブラリをMake/options内のLIB_LIBSに追加しましょう。
LIB_LIBS = \
-l... \
-lnew
最後に、ライブラリを以下のコマンドで再コンパイルしましょう。
wmake libso


