OpenFOAM自己提供的标准类都是以库的形式提供的,并且利用头文件给出了库的应用接口。这样一来,用户的代码中即使用到了某个类,也不需要对源文件进行重新编译了。这样做有好有坏:好处是提高了效率;坏处是源文件(.c)进行修改了但如果不重新编译的话会导致库文件不会被更新,从而用户代码中用到的还是旧库。缺点可以弥补,那就是在修改了代码之后进行重新编译,但是一般情况下,我们完全可以不去动OpenFOAM的源文件。(前面提到了编译器会根据文件的修改情况决定是否重新编译,针对的是.h文件,而非.c源文件)
既然OpenFOAM采用的是上面的这种机制,那么用户在自己定义某个类之后该如何处理呢?标准的做法也是将其生成库文件,就像OpenFOAM本身提供的那样。当然用户很可能会修改自己的这个类,那么在修改之后记得重新编译就好了。那么,如何生成用户自定义的库呢?
OpenFOAM提供了一个库:foamUser。如果查看目录$FOAM_LIBBIN会发现该库文件。不过OpenFOAM本身并未给此库提供什么功能,它相当于一个“空库”,等待用户自己去添加。与之对应,在$FOAM_SRC目录下可以找到一个foamUser文件夹,这是一个模版,提供了一个现成的框架,其中Make文件夹中的files和options文件提供了利用wmake进行编译时的选项。其中files文件内容如下:
libfoamUser.C //指出源文件
LIB = $(FOAM_LIBBIN)/libfoamUser //LIB指出编译为库,等号后为所添至库的路径
编译为库的命令为 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文件夹及options和files文件(Make文件夹应位于工程目录下,最好该目录下所有源文件应都在编译范围内)
3. 修改options文件,确定头文件搜索路径,所引用库文件(搜索路径&库)
4. 修改files文件,确定编译范围和输出位置、输出库文件名
5. wmake libso
评论