在OpenFOAM中做用户自定义库——编译library【转载】

转载自:http://openfoam.blog.sohu.com/22041538.html

OpenFOAM自己提供的标准类都是以库的形式提供的,并且利用头文件给出了库的应用接口。这样一来,用户的代码中即使用到了某个类,也不需要对源文件进行重新编译了。这样做有好有坏:好处是提高了效率;坏处是源文件(.c)进行修改了但如果不重新编译的话会导致库文件不会被更新,从而用户代码中用到的还是旧库。缺点可以弥补,那就是在修改了代码之后进行重新编译,但是一般情况下,我们完全可以不去动OpenFOAM的源文件。(前面提到了编译器会根据文件的修改情况决定是否重新编译,针对的是.h文件,而非.c源文件)

 

既然OpenFOAM采用的是上面的这种机制,那么用户在自己定义某个类之后该如何处理呢?标准的做法也是将其生成库文件,就像OpenFOAM本身提供的那样。当然用户很可能会修改自己的这个类,那么在修改之后记得重新编译就好了。那么,如何生成用户自定义的库呢?

 

OpenFOAM提供了一个库:foamUser。如果查看目录$FOAM_LIBBIN会发现该库文件。不过OpenFOAM本身并未给此库提供什么功能,它相当于一个"空库",等待用户自己去添加。与之对应,在$FOAM_SRC目录下可以找到一个foamUser文件夹,这是一个模版,提供了一个现成的框架,其中Make文件夹中的filesoptions文件提供了利用wmake进行编译时的选项。其中files文件内容如下:

 

 

 

编译为库的命令为 wmake libso 。而libfoamUser.C中用到的头文件或者库同样在Make/options文件中说明,方式与编译可执行文件相同,不过关键字EXE要换成LIB,亦即:

 

LIB_INC = \

-I<directoryPath> \

... \

 

LIB_LIBS = \

-L<libraryPath> \

... \

-l<library> \

... \

 

可见,$FOAM_LIBBIN中的库文件就是由$FOAM_SRC/foamUser下的内容生成的(或者添加,因为每个源文件都可以添加到某一个已经存在的库中,如果该库不存在,则生成。当然也可以同时将很多源文件添加到某库中,这时Make/files文件中源文件的数量就不止一个,从这也可以看出,wmake在进行编译的时候判断依据实际上就是Make文件夹)

 

仿照上面的"标准"方式,我们可以开发自己的库了。针对不同的开发功能,我们将foamUser这个名字替换成我们自己所需要的(名字取得直观一些,采用"驼峰"式)。这样做的好处就是方便代码管理,有条理的工作总能提高效率。建议:

 

自定义库的源文件统一放在$FOAM_USER/src目录下,以功能分类存储(对应文件夹)

自定义库生成至$FOAM_USER_LIBBIN/

库的名称与相应文件夹同名

 

总结一下,用户自定义库需要进行以下工作:

 

1.编写源文件(一个或多个,多个情况建议分文件夹存储)

2.确定wmake范围,建立Make文件夹及optionsfiles文件(Make文件夹应位于工程目录下,最好该目录下所有源文件应都在编译范围内)

3. 修改options文件,确定头文件搜索路径,所引用库文件(搜索路径&库)

4. 修改files文件,确定编译范围和输出位置、输出库文件名

5. wmake libso

 

将自己的源码编译为库,同时做好其应用接口——头文件,我们就可以轻松应用自己的库了,就像OpenFOAM自己提供的一样。一个好的习惯是,在编好一个源文件之后,就给出相应的头文件,并且命名相同,OpenFOAM本身就是这样做的。

posted @ 2016-07-19 09:21  硫酸亚铜  阅读(3165)  评论(0编辑  收藏  举报