ユーザーガイド 1.5系 - 3.2 アプリケーションやライブラリのコンパイル

出典: OFWikiJa

[next] [prev] [up]

[編集] 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.Cnc.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オプションが指定されたヘッダーファイルを検索します。

  1. $WM_PROJECT_DIR/src/OpenFOAM/lnInclude ディレクトリ
  2. newApp/lnIncludeのようなローカルディレクトリ
  3. newAppのようなローカルディレクトリ
  4. /usr/X11/include and $(MPICH_ARCH_PATH)/includeのように,プラットフォームに依存する$WM_PROJECT_DIR/wmake/rules/$WM_ARCH/ディレクトリの中のファイルに設定されているパス
  5. -Iオプションを持つMake/optionsファイルの中で明確に指定されている他のディレクトリ

Make/optionsファイルは構文を使っているヘッダーファイルを配置するためのフルディレクトリパスを含みます。

EXE_INC = \ 
    -I<directoryPath1> \ 
    -I<directoryPath2> \ 
    ...                \ 
    -I<directoryPathN> 

ディレクトリ名は頭に-Iをつけ、各行ではEXE_INCを続けるために構文は\を使い、最終記入後は\をつけないことに注意してください。

[編集] 3.2.2.2 ライブラリへのリンク

コンパイラは、以下のwmakeの-Lオプションで指定されたディレクトリパスのオブジェクトライブラリファイルにリンクします。 

  1. $FOAM_LIBBIN ディレクトリ
  2. $WM_DIR/rules/$WM_ARCH/デイレクトリの中に設定された機種に依存するパス,例えば,/usr/X11/や$(MPICH_ARCH_PATH)/lib
  3. Make/optionsファイルで指定された他のディレクトリ

リンクされる実際のライブラリファイルは-lオプションで指定し,接頭辞lib,ライブラリファイルの拡張子.soをを外さなければなりません。例えばライブラリlibnew.soはフラグ-lnewに含まれます。

デフォルトでは,wmakeは以下のライブラリをロードするようになっています

  1. $FOAM_LIBBINディレクトリからのlibOpenFOAM.soライブラリ;
  2. $WM_DIR/rules/$WM_ARCH/ディレクトリの中のファイルに設定された機種に依存するライブラリ,例えば,/usr/X11/libにおけるlibm.soや,$(LAM ARCH PATH)/libにおけるliblam.so;
  3. 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
fileModificationSkewNFSの上で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

[next] [prev] [up]