OpenFOAM 创建程序和使用动态链接库

创建应用程序

创建用户applications目录, 创建HelloWorld目录作为应用程序的源代码目录

1
2
3
4
$ mkdir –p $FOAM_RUN/../applications
$ cd $FOAM_RUN/../applications
$ mkdir HelloWorld
$ cd HelloWorld

源程序文件

1
$ cat HelloWorld.C

1
2
3
4
5
6
7
8
9
#include "fvCFD.H"
int main(int argc, char* argv[])
{
Info << "Hello world!" << endl;
Info << "Dear FOAMers," << nl
<< "I come from Wuhan, China" << endl;
return 0;
}

编写Make文件,包括Make/files和Make/options。

1
$ cat Make/files

1
2
3
HelloWorld.C
EXE = $(FOAM_USER_APPBIN)/HelloWorld
1
$ cat Make/options
1
2
3
4
5
6
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = -lfiniteVolume \
-lmeshTools

使用wmake编译

1
$ wmake

运行程序

1
$ HelloWorld

这里可以直接使用HelloWorld命令,而不给全它的路径,是因为其所在的$FOAM_USER_APPBIN目录已经在PATH环境变量里面了。

创建并链接动态库

下面我们开始创建一个叫MyLib的动态链接库,里面有两个简单函数。之后在HelloWorld程序里面调用这两个库函数。

MyLib库的源代码就在HelloWorld目录里面创建:

1
$ mkdir MyLib

接着在MyLib目录里面创建库的源程序和头文件。首先看MyLib库的头文件,

1
$ cat MyLib/MyLib.H

1
2
3
4
5
6
7
8
#ifndef MyLib_H
#define MyLib_H
#include "fvCFD.H"
void funA();
void funB();
#endif

再看库的源文件

1
$ cat MyLib/MyLib.C

1
2
3
4
5
6
7
8
9
10
11
#include "MyLib.H"
void funA()
{
Info << "I'm from MyLib, funA()" << endl;
}
void funB()
{
Info << "I'm from MyLib, funB()" << endl;
}

最后为这个库的写Make文件如下

1
$ cat MyLib/Make/files

1
2
3
MyLib.C
LIB = $(FOAM_USER_LIBBIN)/libMyLib
1
$ cat MyLib/Make/options
1
2
3
4
5
6
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = -lfiniteVolume \
-lmeshTools

现在可以用wmake编译这个生成动态链接库了,在HelloWorld目录执行

1
wmake libso MyLib

或者进入MyLib目录执行wmake libso

1
2
$ cd
$ wmake libso

都可以。编译成功后会提示生成的动态链接库文件会存放在$FOAM_USER_APPBIN目录。

接下来我们在HelloWorld里面使用MyLib这个动态链接库的funA()funB()函数。当然先要在HelloWorld.C里面包含头文件”MyLib.H”,

1
2
3
4
5
6
7
8
9
10
#include "fvCFD.H"
#include "MyLib.H"
int main(int argc, char* argv[])
{
...
// use dynamic library
funA();
funB();
...

在HelloWorld的Make/options里面添加MyLib库的位置(-L选项)、库头文件位置(-I)、库文件(-l)

1
$ cat Make/options

1
2
3
4
5
6
7
8
9
10
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-IMyLib/lnInclude
EXE_LIBS = \
-L$(FOAM_USER_LIBBIN) \
-lfiniteVolume \
-lmeshTools \
-lMyLib

重新编译HelloWorld

1
$ wmake

最后运行

1
$ HelloWorld

输出如下结果

1
2
3
4
Dear FOAMers,
I come from Wuhan, China
I'm from MyLib, funA()
I'm from MyLib, funB()

DONE!!!