CGNS库在Win32和Win64平台的编译和链接

来源:互联网 发布:淘宝开店怎样推广 编辑:程序博客网 时间:2024/06/05 02:28

    这两年在csdn技术博客上伸手了不少信息,也感谢前辈们分享自己的经验。终于找到时间付出一些东西,这篇算是开博试笔。

    由于我的专业偏向工程计算,并不是纯粹的程序员,所以可能有兴趣看这篇博客的也是工程(实体工程,不包括软件工程哈)或科研界的同仁,如果有什么问题可以留言,多多交流为善。

    CGNS(CFD General Notation System,CFD通用标记系统)是NASA和AIAA共同推荐的计算流体动力学(CFD)数据存储标准,该系统努力使CFD 的输入和输出标准化,包括网格、流动解、连接性、边界条件(BC)以及辅助信息。CGNS 也很容易扩展到其它需要存储场数据的科学和工程领域,并允许给文件打上标记和插入用户注释,对于有兴趣编写CFD求解器需要读取cgns格式的结构或非结构网格数据的研究人员,或者对于开发科学数据后处理软件的程序员都十分有用。CGNS以开源的形式在sourceforge上发放,每个人都可以免费下载源代码并自行编译成库文件。CGNS库目前的源代码版本是3.2.1。

    CGNS的低层系统采用ADF(先进数据格式)和HDF5(第五代层级数据格式)两种数据格式,早期的CGNS只包含ADF一种底层系统,后来(2.5版本以后)加入了HDF5系统并且把HDF5格式认定为官方格式,同时继续支持ADF格式;其中的原因和演变史有兴趣可以查看官网的文档主页。底层系统用于直接创建和读写二进制文件,CGNS 其实就是封装了ADF和HDF5底层功能的第二层软件,称为中级程序库(mid-level library)或者 API(应用程序接口),这个mid-level library一般就是开发者直接与CGNS打交道的函数库。

    CGNS官网给出的源代码包是按照开源的标准发布的,其中只包含ADF底层系统和mid-level lib的源代码,如果想要加入HDF5底层系统和zlib压缩功能需要用户提供HDF5库和zlib库的安装目录。开源文件在Linux上的编译相对简单,直接./configure; make; make install就解决了大部分问题,其余的configure选项可以在源代码包提供的README.config文件中找到,写得很详细就不多做介绍了。这里主要介绍CGNS库在Win32和Win64平台的编译和链接,因为这些简单的步骤折腾了笔者一周的时间才搞清楚,分享出来希望能帮到感兴趣的人。

    如果只需要CGNS的ADF底层系统并且不编译CGNS源码包中的tools(工具集)文件夹,MinGW64+msys环境应该是首选,因为msys可以模拟Linux环境并且不损失运行效率:直接在msys环境进入源码包所在的目录,然后

tar -zxvf cgnslib_3.2.1.tar.gzcd cgnslib_3.2.1/src./configure --enable-gcc --enable-64bit(编译64位库可选) --enable-lfs(支持2G以上大文件可选) --enable-shared(编译动态库(.so后缀)可选,默认为静态库(.a后缀)) --prefix=installdir
make cgnsmake install-cgns

这样会生成libcgns.a文件(静态库)或者libcgns.a和libcgns.so文件(动态库)并且安装到指定安装目录installdir。注意如果要编译64位(Win64平台)的CGNS库需要在msys环境中添加MinGW64的64位工具链支持,反之添加32位工具链支持,具体方法可以参考http://blog.csdn.net/Cedareal/article/details/8365477。当然32位CGNS库也能在Win64下运行,但效率会差些。完成后可以用官网提供的UserGuideCode 3.1.2中的write_grid_str.c源文件做测试

gcc -g -O2 write_grid_str.c -I installdir/include -L installdir/lib -lcgns -o write_grid_str.exe

成功编译并运行会生成一个grid_c.cgns的网格数据文件,用记事本打开可以看到开头ADF的字样(adf格式),这样就证明CGNS库可用了。

    如果需要在CGNS库中加入HDF5和zlib的支持并且编译tools文件夹以得到在hdf5和adf之间转换格式的工具程序,步骤就显得繁琐一些。因为HDF5的官网http://www.hdfgroup.org/HDF5/并没有提供适用于MinGW64+msys环境的预编译二进制包,而且提供的源代码包hdf5-1.8.13.tar.gz经笔者测试很难在msys环境下编译成功,据官方说法在cygwin环境下应该可以编译,但考虑到cygwin庞大的体积和较低的运行效率,最终笔者决定求助于微软原生的编译系统Visual C/C++。选择VC+cmd环境的主要原因是HDF5官网提供了32位和64位的VS2012 C/C++原生编译二进制发布包,这样就省去了自行编译HDF5库的麻烦,而且CGNS源码包中也有对VC编译器的直接支持,这样使编译过程变得相当通顺。

    首先,在zlib官网下载官方二进制发布包,解压缩到目录zlib,然后下载HDF5官方Windows安装包(VS2012编译),安装至目录HDF5。最后在微软下载中心下载Windows SDK 7.1(现在免费了哈),安装完成后开始菜单运行Windows SDK 7.1 Command Prompt,进入CGNS源码包所在的目录,设置VC编译环境

setenv /Release /x86(32位环境)setenv /Release /x64(64位环境)

接下来

cd cgnslib_3.2.1/srcconfigure.bat -MT -lfs(支持2G以上大文件可选) -64(编译64位库可选) -dll -hdf5 HDF5 -zlib zlib/lib/zdll.lib -install installdir
nmake cgnsnmake toolsnmake install-cgnsnmake install-tools

其中configure.bat是CGNS源码包中提供的VC编译环境配置批处理文件,这里建议启用编译动态链接库-dll选项,以便其他编译器调用VC编译生成的cgns.dll文件,除此之外,安装目录还包括一个导入库cgns.lib和一系列.exe后缀的工具程序,工具程序的用法可以去官网查用户手册。完成后同样采用write_grid_str.c源文件测试

cl /W3 /O2 write_grid_str.c /I installdir\include /I HDF5\include /link installdir\lib\cgns.lib HDF5\lib\hdf5.lib /out:write_grid_str.exe

注意这里需要添加HDF5库安装目录的include和lib子目录,因为生成的可执行程序需要包含或链接HDF5库的头文件和库文件,这样默认生成的就是hdf5格式的网格数据文件grid_c.cgns。

    采用MinGW64+msys环境调用VC生成的dll动态库需要将VC导入库转换成MinGW导入库(.a后缀),具体转换方法有很多,可以参考http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs。只不过要注意区别对待32位和64位的导入库,应该采用对应的二进制转换工具进行转换。另外,除采用C/C++语言调用CGNS库以外,采用以上方法编译的CGNS库默认添加了Fortran90接口,对于熟悉Fortran语言的工程师就是福音了。

1 0