使用Qt的MinGW编译器编译NetCDF4源码的过程总结

  我们经常在一些项目中会用到NetCDF库,这个库和谷歌的ProtoBuf很类似,但是NetCDF库在其官网上只提供了专用于MSVC编译器的版本,并没有现成的用于MinGW编译器的版本的库,因此这需要我们自己编译,但该源码中是使用CMake组建的整个工程。编译的过程中难免会遇到一些问题。这里我做一个总结,各位尽量去避避坑。

一、文件的准备

  这个NetCDF库会用到HDF5这个库,还会用到所谓的libxml2和libcurl和libiconv和zlib,这些文件可以在这里的链接都下载到,我这里编译的NetCDF版本是4.9.2

  下载链接(need VPN):https://drive.google.com/file/d/1NO1Yj7OZ-p-mExJjctKdNltCl-bRSONo/view?usp=drive_link

二、配置编译器的环境变量

  我们首先要知道一点,就是说,我最终的库需要什么版本的(比如是MinGW,又或者是MSVC版本的),那么其依赖库的版本和位数都得是一样的,你不能说,我HDF5需要MinGW版本的,然后你去编译其依赖库libz的时候你编译一个MSVC版本的和HDF5库进行链接,这必然不可以。同样的,保证编译库版本一致时,还得保证库的位数和依赖库的位数必须是一样的,你不能说,我编译一个64位的HDF5库,但是由于这个库需要libz库,但你稀里糊涂的把libz编译为了32位的,那最后编译(严格来讲应该是链接)的环节100%会出问题。所以在编译这些库时,一定要先确认自己需要什么位数的库(32还是64),是什么版本的(MinGW还是MSVC的)

  我由于项目需要,我最终所需要的库的版本是32位的MinGW的NetCDF库,那么我这个案例就以这个32为为主。你们自己想编译什么就看着办就行。

  然后我们需要将Qt里面内置的MinGW编译器的bin目录配置到环境变量里面(我需要的是32位的MinGW的库,因此这里我就是这样的路径,你根据你们的需求即可)

  

三、编译libz

  由于编译HDF5库时需要用到libz库和一些其他的库,那么我们就得首先编译它们。

  3.1 使用CMake GUI打开libz的源码库目录

  

  3.2 选择编译器的类型

  

  这里只是确认了编译器的类型,至于你编译的libz是32位还是64位,取决于你最后使用的是MinGW32编译的还是MinGW64编译的。

  3.3 configure

  我们只是需要libz的库,不需要在里面的所谓的实例程序,这里不需要勾选。

  检查编译器类型是否正确

  配置安装目录

  这个安装目录也就是当我们使用make命令编译完成后,当执行make install之后,这些编译好的库和标头会被放到这里的路径里面,这个一般不需要去改动它。

  3.4 点击Generate

  3.5 使用PowerShell进入到build目录中

  注意:需要在这个目录里面按住Shift并同时点击鼠标右键才能看到这个"在此处打开PowerShell窗口"菜单项

  输入mingw32-make进行编译(实际上这个mingw32-make就是make,只不过在Windows下不叫make而已,它本质上就是make,只不过换了一个名字而已)

  

  输入mingw32-make install进行安装

  

  至此,libz的编译安装已经完成

四、编译libcurl

  同样的,libcurl库的编译也是为其他库的编译所必须的依赖库,同样的,我们需要按照编译libz的步骤来编译它

  4.1 使用CMake GUI工具打开libcurl的源码目录

  

  4.2 点击configure并配置编译器的类型

  

  4.3 在进行Generate之前,我们需要先配置一些东西

  配置编译出来的东西,我们这里需要CURL的可执行文件和动态库以及纯静态库文件

  检查编译器是否正确(我这里是32位,你们的具体由你们配置的编译器的环境变量决定)

  配置libz的路径(我们刚刚才编译安装了libz,就需要将安装的路径填到在里面)

  4.4 点击Generate生成Makefile文件

 

  4.5 编译并安装libcurl

  进入到build目录,按住Shift的同时点击鼠标右键,打开PowerShell窗口,输入mingw32-make进行编译

  

  输入mingw32-make install进行安装

  至此,libcurl的编译和安装就完成了

五、编译Iconv

  Iconv的编译是为了给之后的libxml2编译做依赖库的,因此我们也必须要编译安装它

  5.1 使用CMake GUI工具打开Iconv的源码目录

 

  5.2 点击Configure

  点击Yes

  选择编译器的类型

  同样的,在Generate之前,我们需要配置一些东西

  我们需要生成可执行文件、动态库文件和静态库文件,而测试的程序不需要也没必要生成

  检查编译器的位数是否正确(我这里是32,你们的是你们自己配置的环境变量里面的MinGW编译器的位数)

  5.3 点击Generate生成Makefile文件

  5.4 在build目录中打开PowerShell窗口编译和安装

  在iconv库中的build目录中按住Shift键并点击鼠标右键,打开PowerShell窗口,然后输入mingw32-make进行编译

  输入mingw32-make install进行安装

  至此,Iconv库的编译到此为止

六、编译安装libxml2库

  我们的NetCDF库需要依赖到libxml2库,还需要依赖libcurl库,还需要libz库和HDF5库,这里我们继续编译我们的libxml2库

  6.1 使用CMake GUI工具打开libxml2库的源码包

  6.2 选择编译器

  6.3 有报错,其实是Iconv没有配置,我们手动配置一下即可

  配置一下Iconv

  检查一下编译器是否正确

  再次Configure,没有问题了

  6.4 点击Generate生成Makefile文件

  6.5 在libxml2的build目录中打开PowerShell窗口进行编译和安装

  在libxml2的build目录中按住Shift并单击鼠标右键,打开PowerShell窗口,然后输入mingw32-make之后回车进行编译

  编译完成后,输入mingw32-make install进行安装

  至此,libxml2的编译和安装告一段落。

七、编译和安装HDF5库

  前面所有的工作都是为了编译这个HDF5库,因为这个库会用到前面编译的一些库,有了前面的铺垫,编译这个库就会很简单。

  7.1 使用CMake GUI工具打开HDF5库的目录

  7.2 配置编译器

  7.3 然后我们需要配置一些东西(无论你那里有没有报错)

  配置生成的文件(我们需要动态库,可执行文件、静态库和用户自定义的库),我们不需要也没必要要测试的程序

  

  检查一下编译器是否是正确的(我这里编译的是32位的MinGW,你们的取决于你们环境变量里面配置的)

  配置libz的路径

  重新点击Configure

  7.4 点击Generate生成Makefile文件

  7.5 在HDF5的build目录中编译并安装

    在这个build目录中按住Shift并单击鼠标右键,打开PowerShell窗口,然后输入mingw32-make进行编译

  

  编译完成之后,输入mingw32-make install进行安装

  至此HDF5的编译已经完成。

八、编译NetCDF库

  前面的工作,都为了编译这个NetCDF库,接下来我们编译NetCDF库,在里面会需要修改很多东西才能编译到。

  8.1 使用CMake-GUI工具打开NetCDF源码目录

  8.2 配置编译器

  8.3 有报错,不急,一个一个配,一个一个的解决

  配置libz的路径和文件

  配置hdf5的路径和文件

  检查编译器是否是预期的

  配置编译的文件

  我们不需要测试程序,但其他的都要

  完成上述配置后,我们再点击一次Configure,然后我们还需要配置一些东西

  配置libxml2

  注意:这里虽然是include_DIR,但是这里必须要写成libxml2目录,因为NetCDF有几个文件引用的路径不是很标准,否则会引起大量的改动很麻烦

  

  配置ENABLE里面的这两个,不要构建它们(取消勾选即可)

  完成上述配置后,再次点击Configure,然后点击Generate生成Makefile文件

  8.4 编译并安装NetCDF4库

  NetCDF4库编译就没有前面那么简单了,因为我们需要边编译,边修改一些源码里面的东西,但是不要担心,我们所涉及到的修改并不会影响到NetCDF4核心库的功能,我们所做的一些修改无非就是测试程序里面的一些东西而已,这些和核心库没有关系,它们只是测试核心库里面的函数是否能工作的。

  8.4.1 在NetCDF4源码的build目录中打开PowerShell窗口,并输入mingw32-make执行编译

  第一个错误:头文件引用的路径不对

  

  我们需要去源码目录中找到ncxml_xml2.c这个文件,用NotePad++打开它,修改它的第5行为:

  保存了之后,回到刚刚的PowerShell窗口继续编译即可。

  第二个错误:zfilter.c中引用了核心库中的一些函数,但核心库还没有被编译出来,导致的链接错误。(我们需要去这个.c文件里面注释掉有以下红线中的函数的内容,无需担心修改这个文件回对核心库造成影响,因为这个.c文件和核心库的功能是毫不相干的)

 

  我们需要去源码目录中找到zfilter.c这个文件,依次搜索红线中这几个函数,并将其注释掉。

  然后继续编译,就可以了

  然后,我们安装

  输入mingw32-make install 

  最后,我们就可以看到生成的库文件和ncdump以及标头了

posted @ 2024-09-20 16:24  蜡笔小新Pointer  阅读(332)  评论(1)    收藏  举报