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

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

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

OpenFOAM提供了一个库:foamUser。如果查看目录$FOAM_LIBBIN会发现该库文件。不过OpenFOAM本身并未给此库提供什么功能,它相当于一个"空库",等待用户自己去添加。与之对应,在$FOAM_SRC目录下可以找到一个foamUser文件夹,这是一个模版,提供了一个现成的框架,其中Make文件夹中的files和options文件提供了利用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文件夹及options和files文件(Make文件夹应位于工程目录下,最好该目录下所有源文件应都在编译范围内)

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

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

5. wmake
libso

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

在OpenFOAM中做用户自定义库——编译library【转载】的更多相关文章

  1. Python圈中的符号计算库-Sympy(转载)

    <本文来自公众号“大邓带你玩python”,转载> import math math.sqrt(8) 2.8284271247461903 我们看看Python中结果 math.sqrt( ...

  2. OpenFOAM中的基本变量快速认知【转载】

    转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102vsf9.html label 实际上就是整型数据的变体,int,OF对它进行了包装,以适应32或64位系 ...

  3. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

  4. 68.vivado与modelsim的关联以及器件库编译

    vivado软件中也自带仿真工具,但用了几天之后感觉仿真速度有点慢,至少比modelsim慢挺多的.而modelsim是我比较熟悉的一款仿真软件,固然选它作为设计功能的验证.为了将vivado和mod ...

  5. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  6. codec engine工程中使用ccs下编译的lib库

    原文地址:codec engine工程中使用ccs下编译的lib库--转作者:木子小白 这两天将dsp的算法程序放到ccs下,生成lib库文件 这样的好处就是: 1. 算法封装成lib库以后,看不到源 ...

  7. 详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法

    详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法 一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src- ...

  8. json库的编译方法和vs2010中导入第三方库的方法

    json库的编译方法和vs2010中导入第三方库的方法 一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/  ...

  9. Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...

随机推荐

  1. 【转载】Sqlserver使用Group By进行分组并计算每个组的数量

    在SQL语句查询中,Group By语句时常用来进行分组操作,有时候在分组的同时还需要计算出每个组的数量多少.在Sqlserver数据库中可以使用Group By加Count聚合函数来实现此功能,即通 ...

  2. stm32 SD卡

    容量等级 SD容量有8MB.16MB.32MB.64MB.128MB.256MB.512MB.1GB.2GB SDHC容量有2GB .4GB.8GB.16GB.32GB SDXC容量有32GB.48G ...

  3. SQLSEVER在存储过程或触发器中模糊查询拼接

    declare @name nvarchar(50); declare @name_pin nvarchar(50); set @name_pin = '%'+@name +'%' 模糊查询: sel ...

  4. pandas 25 式

    英文版 Jupyter Notebook 链接:https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/to ...

  5. redis连接数高居不下,怎么破?。。。。这么破

    最近项目一直在使用redis,首次用redis,随便从网上找了例子就用了,一开始用的还挺正常,后来发现,当客户端访问量一上来,redis的连接数居高不下,一开始以为是客户端没有关闭,开始怀疑redis ...

  6. jenkins中的流水线( pipeline)的理解(未完)

    目录 一.理论概述 Jenkins流水线的发展历程 什么是Jenkins流水线 一.理论概述 pipeline是流水线的英文释义,文档中统一称为流水线 Jenkins流水线的发展历程 ​ 在Jenki ...

  7. 网络编程socketserver

    一.网络编程回顾 tcp是流式传输,字节流,数据与数据之间没有边界 优点:不限定长度,可靠传输 缺点:慢,和一端的通信连接conn会一直占用通信资源 udp协议式面向数据包的传输 优点:快,由于不需要 ...

  8. java.lang.NoClassDefFoundError: Could not initialize class xxx

    感慨:啊啊啊啊啊啊啊啊啊啊,这个问题弄了我好久,整整一天!!! 概述:原本是调用公司自己写的jar包的工具类.在其他项目都能调用,一模一样的套用过来就是不行.问了一些同事他们也不知道怎么解决. 然后百 ...

  9. linux运维之路配置网络

    前言裸机上装操作系统,想和物理机通信需要设置IP 开机以后: 第一步:setup命令  ——>  NetWork configguation  ---->Device configurat ...

  10. 7 html-webpack-plugin的两个基本作用

    html-webpack-plugin的作用: 1.在内存中根据我们的index模板页面,生成一个内存里面的首页 2.当使用html-webpack-plugin之后,我们不再需要手动处理bundle ...