ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路

news2024/11/25 14:30:05
2023年10月29日

环境说明

操作系统版本:ubuntu  18.04

python版本:3.6.9

gcc版本:7.5.0

编译安装路径:/usr/local

cmake: 3.10.2

所需要的源码包我已经打包放到我的资源。

2021年1月份已经写过一篇Ubuntu 编译安装的帖子FLEXPART安装配置笔记(成功案例)——筑梦之路_筑梦之路的博客-CSDN博客

也遇到比较多的网友来咨询在编译安装过程中的问题,因此今天再次整理一下编译安装的过程,顺便解决之前写的不是很明确的地方,欢迎大家交流指正。

准备编译工作

# 更新软件源
sudo apt-get update

# 安装编译工具和依赖包
sudo apt-get install -y g++ gfortran autoconf libtool automake flex bison cmake python3-dev python3-pip git vim curl unzip build-essential libbz2-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev ruby


# 安装python相关包

sudo apt-get install -y python3 python3-eccodes python3-genshi python3-numpy gfortran fftw3-dev libeccodes-dev libemos-dev


# 配置pip显示的格式

sudo mkdir ~/.pip

sudo cat > ~/.pip/pip.conf << EOF
[list]
format=columns
EOF

# 建立软链接

sudo ln -sf /usr/bin/python3 /usr/bin/python
sudo ln -sf /usr/bin/pip3 /usr/bin/pip

# 检查

sudo python -V
sudo pip -V

 准备python环境

# 安装pip的包

sudo pip3 install cdsapi ecmwf-api-client eccodes==1.6.1 -i https://pypi.douban.com/simple
 
#检查是否安装成功

sudo python3 -c "import eccodes; print(eccodes.__version__)"
sudo python3 -c "import genshi; print(genshi.__version__)"
sudo python3 -c "import numpy; print(numpy.__version__)"
sudo pip3 list | grep cdsapi | awk '{print $2}'
sudo python3 -c "import ecmwfapi; print(ecmwfapi.__version__)"

编译安装

1. 编译安装jasper

# 下载源码包

wget -c http://www.ece.uvic.ca/~mdadams/jasper/software/jasper-1.900.1.zip

# 解压文件到指定目录

unzip jasper-1.900.1.zip -d /usr/local/

# 新建目录

mkdir -p /usr/local/jasper

# 切换目录

cd /usr/local/jasper-1.900.1

# 配置

CFLAGS="-fPIC" ./configure --prefix=/usr/local/jasper

# 编译
make

# 编译检查
make check

# 安装
make install

2. 编译安装grib_api

# 下载源码

wget -c https://people.freebsd.org/~sunpoet/sunpoet/grib_api-1.28.0-Source.tar.gz

# 解压到指定目录

tar -zxvf grib_api-1.28.0-Source.tar.gz -C /usr/local/

# 创建目录

mkdir -p /usr/local/grib_api

# 切换目录

cd /usr/local/grib_api-1.28.0-Source

# 编译三部曲

./configure --prefix=/usr/local/grib_api --with-jasper=/usr/local/jasper

make

make check

make install

3. 编译安装eccodes

# 下载源码

wget -c  https://confluence.ecmwf.int/download/attachments/45757960/eccodes-2.7.3-Source.tar.gz?api=v2

# 解压源码到指定目录

tar xvzf eccodes-2.7.3-Source.tar.gz -C /usr/local/

# 创建目录

mkdir -p /usr/local/eccodes

# 切换目录

cd /usr/local/eccodes-2.7.3-Source

# 编译三部曲

mkdir build && cd build

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/eccodes /usr/local/eccodes-2.7.3-Source -DPYTHON_EXECUTABLE=/usr/bin/python3

make

ctest

make install

# 配置环境变量

cat >> /etc/profile << 'EOF'
export ECCODES_SAMPLES_PATH=$PATH:/usr/local/eccodes/share/eccodes/samples
export ECCODES_DEFINITION_PATH=$PATH:/usr/local/eccodes/share/eccodes/definitions
EOF

source /etc/profile

# 检查验证

sudo apt-get install libeccodes-dev
python3 -m eccodes selfcheck

# 正常输出如下:
Found: ecCodes v2.6.0.
Your system is ready.

4. 编译安装zlib

# 下载源码

v=1.2.8  

sudo wget http://www.zlib.net/fossils/zlib-${v}.tar.gz

# 解压到指定目录

sudo tar -xf zlib-${v}.tar.gz -C /usr/local/ && cd /usr/local/zlib-${v}

# 编译三部曲

sudo ./configure --prefix=/usr/local

sudo make && make install

5. 编译安装 szlib

# 下载源码

v=2.1
wget http://sources.buildroot.net/szip/szip-${v}.tar.gz

# 解压到指定目录

tar -xf szip-${v}.tar.gz -C /usr/local/

cd /usr/local/szip-${v} && mkdir -p /usr/local/szip

# 编译三部曲

./configure --prefix=/usr/local/szip
make
make install

6. 编译安装hdf5

# 下载源码

v=1.8.13

wget https://www.gfd-dennou.org/arch/ucar/netcdf/netcdf-4/hdf5-${v}.tar.gz

# 解压到指定目录

tar -xf hdf5-${v}.tar.gz -C /usr/local/ && cd /usr/local/hdf5-${v}

# 设置变量

prefix="/usr/local/hdf5-$v"
 
echo "Add HDF5_DIR=$prefix to .bashrc"

echo "" >> ~/.bashrc

echo "# HDF5 libraries for python" >> ~/.bashrc

echo export HDF5_DIR=$prefix  >> ~/.bashrc

# 编译三部曲
 
./configure --enable-shared --enable-hl --prefix=$HDF5_DIR

make -j 2              # 2 for number of procs to be used

make install

7. 编译安装netcdf-c

# 下载源码

v=4.1.3

wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/netcdf-${v}.tar.gz

# 解压到指定目录

tar -xf netcdf-${v}.tar.gz -C /usr/local/ && cd /usr/local/netcdf-${v}

# 设置变量

prefix="/usr/local/"
 
echo "Add NETCDF4_DIR=$prefix to .bashrc"
echo "" >> ~/.bashrc
echo "# NETCDF4 libraries for python" >> ~/.bashrc
echo export NETCDF4_DIR=$prefix  >> ~/.bashrc

# 编译三部曲

CPPFLAGS=-I$HDF5_DIR/include LDFLAGS=-L$HDF5_DIR/lib ./configure --enable-netcdf-4 --enable-shared --enable-dap --prefix=$NETCDF4_DIR

make 
make install

8. python Netcdf4 安装

# install python's netCDF4

sudo pip3 install cftime==1.3.1 -i https://pypi.douban.com/simple

sudo pip3 install numpy==1.19.4 -i https://pypi.douban.com/simple

sudo pip3 install netCDF4==1.5.5.1 -i https://pypi.douban.com/simple

sudo python3 -c "import netCDF4;print(netCDF4.__version__)"
 

9. 编译安装FLEXPART10.4

# 下载源码

wget -c https://www.flexpart.eu/downloads/66

# 解压到指定目录

tar -xvf 66 -C /usr/local/ 

# 切换目录

cd /usr/local/flexpart_v10.4_3d7eebf

# 备份src目录

cp -r src src-backup-`date +%F`

# 修改makefile文件

vim makefile

#### 修改第一处

#modified to 64-73行
        ROOT_DIR = /usr/local
 
        F90       = /usr/bin/gfortran
        MPIF90    = /usr/bin/mpifort
         
        INCPATH1  = ${ROOT_DIR}/grib_api/include
        INCPATH2  = ${ROOT_DIR}/jasper/include
        INCPATH3 = /include
        LIBPATH1 = ${ROOT_DIR}/grib_api/lib
        LIBPATH2 = ${ROOT_DIR}/jasper/lib
        LIBPATH3 = /lib

#### 修改第二处

### Enable netCDF output?
ifeq ($(ncf), yes)
        NCOPT = -DUSE_NCF -lnetcdff -lnetcdf
else
        NCOPT = -UUSE_NCF
endif

#### 修改第三处

## LIBRARIES
LIBS = -lgrib_api_f90 -lgrib_api -lm -ljasper $(NCOPT) -lnetcdff
 
FFLAGS   = -I$(INCPATH1) -I$(INCPATH2) -I$(INCPATH3) -O$(O_LEV) -g -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV) $(NCOPT) $(FUSER)  #-Warray-bounds -fcheck=all # -march=native
 
DBGFLAGS = -I$(INCPATH1) -I$(INCPATH2) -I$(INCPATH3) -O$(O_LEV_DBG) -g3 -ggdb3 -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV_DBG) $(NCOPT) -fbacktrace   -Wall  -fdump-core $(FUSER)  #  -ffpe-trap=invalid,overflow,denormal,underflow,zero  -Warray-bounds -fcheck=all
 
LDFLAGS  = $(FFLAGS) -L$(LIBPATH1) -Wl,-rpath,$(LIBPATH1) $(LIBS) -L$(LIBPATH2) -L$(LIBPATH3)
LDDEBUG  = $(DBGFLAGS) -L$(LIBPATH1) $(LIBS) -L$(LIBPATH2) -L$(LIBPATH3)


# 编译

make ncf=yes

# 配置环境变量
cat >> /etc/profile <<'EOF'
export LD_LIBRARY_PATH=/usr/local/grib_api/lib:$LD_LIBRARY_PATH
EOF

source /etc/profile

10. 准备安装flex_extract

# 拉取源码

cd /usr/local

git clone --single-branch --branch master https://www.flexpart.eu/gitmob/flex_extract

1)编译安装zlib 1.2.9


# 下载zlib 1.2.9源码,编译安装zlib 1.2.9版本

wget https://sourceforge.net/projects/libpng/files/zlib/1.2.9/zlib-1.2.9.tar.gz

# 解压到指定目录

tar -zxvf zlib-1.2.9.tar.gz -C /usr/local

cd /usr/local/zlib-1.2.9

# 编译三部曲

./configure; make; make install

# 创建软链接

ln -s -f /usr/local/lib/libz.so.1.2.9 /lib/x86_64-linux-gnu/libz.so.1

2) 编译安装emoslib

# 下载源码

wget https://confluence.ecmwf.int/download/attachments/3473472/libemos-4.5.9-Source.tar.gz

# 创建目录

mkdir /usr/local/emoslib

# 解压到指定目录

tar -xzf libemos-4.5.9-Source.tar.gz -C /usr/local/

# 切换目录

cd /usr/local/libemos-4.5.9-Source

# 编译安装

mkdir build ; cd build 
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/emoslib /usr/local/libemos-4.5.9-Source
make
make install

3)安装ECMWF 与ERA5安装权限

cat > ~/.ecmwfapirc <<EOF
{
    "url"   : "https://api.ecmwf.int/v1",
    "key"   : "8fb37b516ba233bde068613a8f08c785",
    "email" : "791653827@qq.com"
}
EOF


cat > ~/.cdsapirc <<EOF
url: {api-url}
key: {uid}:{api-key}
EOF

4) 修改makefile_local_gfortran文件

# 切换目录

cd /usr/local/flex_extract/Source/Fortran/

# 修改文件

vim makefile_local_gfortran

# change the original path of ECCODES_INCLUDE_DIR to 
ECCODES_INCLUDE_DIR=/usr/include

5) 执行安装flex_extract

# 切换目录

cd /usr/local/flex_extract

# 执行安装

./setup_local.sh

#成功结果输出如下内容

WARNING: installdir has not been specified
flex_extract will be installed in here by compiling the Fortran source in /usr/local/flex_extract/Source/Fortran
Install flex_extract_v7.1.2 software at local in directory /usr/local/flex_extract

Using makefile: makefile_local_gfortran
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./rwgrib2.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./phgrreal.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./grphreal.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./ftrafo.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./calc_etadot.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./posnam.f90
gfortran  rwgrib2.o calc_etadot.o ftrafo.o grphreal.o posnam.o phgrreal.o -o calc_etadot_fast.out  -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -fopenmp
ln -sf calc_etadot_fast.out calc_etadot

lrwxrwxrwx 1 root root 20 Oct 29 06:30 ./calc_etadot -> calc_etadot_fast.out

6)测试flex_extract 

# 测试flex_extract

cd Testing/Installation/Calc_etadot
# execute the Fortran progam without arguments
../../../Source/Fortran/calc_etadot
 
#成功结果展示:
STATISTICS:          98842.4598  98709.7359   5120.5385
STOP SUCCESSFULLY FINISHED calc_etadot: CONGRATULATIONS

至此,已经全部编译安装完成,并测试成功。

这里附上python包的版本信息,以供各位参考:

# pip list
Package                Version            
---------------------- -------------------
asn1crypto             0.24.0             
attrs                  17.4.0             
Automat                0.6.0              
blinker                1.4                
cdsapi                 0.6.1              
certifi                2018.1.18          
cffi                   1.15.1             
cftime                 1.3.1              
chardet                3.0.4              
click                  6.7                
cloud-init             23.1.2             
colorama               0.3.7              
command-not-found      0.3                
configobj              5.0.6              
constantly             15.1.0             
cryptography           2.1.4              
distro-info            0.18ubuntu0.18.04.1
eccodes                1.6.1              
ecmwf-api-client       1.6.3              
findlibs               0.0.5              
Genshi                 0.7                
httplib2               0.9.2              
hyperlink              17.3.1             
idna                   2.6                
importlib-resources    5.4.0              
incremental            16.10.1            
Jinja2                 2.10               
jsonpatch              1.16               
jsonpointer            1.10               
jsonschema             2.6.0              
keyring                10.6.0             
keyrings.alt           3.0                
language-selector      0.1                
MarkupSafe             1.0                
netCDF4                1.5.5.1            
netifaces              0.10.4             
numpy                  1.19.5             
oauthlib               2.0.6              
PAM                    0.4.2              
pexpect                4.2.1              
pip                    9.0.1              
pyasn1                 0.4.2              
pyasn1-modules         0.2.1              
pycparser              2.21               
pycrypto               2.6.1              
pygobject              3.26.1             
PyJWT                  1.5.3              
pyOpenSSL              17.5.0             
pyserial               3.4                
python-apt             1.6.5+ubuntu0.7    
python-debian          0.1.32             
pyxdg                  0.25               
PyYAML                 3.12               
requests               2.18.4             
requests-unixsocket    0.1.5              
SecretStorage          2.3.1              
service-identity       16.0.0             
setuptools             39.0.1             
six                    1.11.0             
sos                    4.3                
ssh-import-id          5.7                
systemd-python         234                
tqdm                   4.64.1             
Twisted                17.9.0             
ubuntu-advantage-tools 27.2               
ufw                    0.36               
unattended-upgrades    0.1                
urllib3                1.22               
wheel                  0.30.0             
zipp                   3.6.0              
zope.interface         4.3.2

如果不关心flexpart的版本,可以直接使用apt-get命令安装

apt-get update  && apt-get install flexpart

 

相关源码包在我的资源或者通过文中链接地址下载。

注意事项:文中源码包的地址会随着时间过期,若不能下载请自行搜索相关版本文件。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android OpenGL ES 2.0入门实践

本文既然是入门实践&#xff0c;就先从简单的2D图形开始&#xff0c;首先&#xff0c;参考两篇官方文档搭建个框架&#xff0c;便于写OpenGL ES相关的代码&#xff1a;构建 OpenGL ES 环境、OpenGL ES 2.0 及更高版本中的投影和相机视图。 先上代码&#xff0c;代码效果如下图…

MQ——进阶

文章目录 消息可靠性生产者消息确认消息持久化消费者确认演示none模式演示auto模式 失败重试机制本地重试失败策略 死信交换机初始死信交换机TTL延迟队列安装DelayExchange插件使用DelayExchange 惰性队列消息堆积问题惰性队列 MQ集群集群分类普通集群镜像模式镜像模式的配置 仲…

私有云:【6】VCenter安装SqlServer

私有云&#xff1a;【6】VCenter安装SqlServer 1、VCenter安装SqlServer1.1、通过模板创建虚拟机1.2、安装sqlserver服务 2、搭建sqlserver群集2.1、安装群集功能2.2、在ad域服务器创建共享文件夹&#xff0c;供集群选举使用 3、创建故障转移群集【只需安装一台即可】3.1、创建…

操作系统 --- 存储器管理

一、简答题 1.存储器管理的基本任务&#xff0c;是为多道程序的并发执行提供良好的存储器环境。请问好的存储器环境”应包含哪几个方面&#xff1f; 答&#xff1a; 2.内存保护是否可以完全由软件实现&#xff1f;为什么&#xff1f; 答&#xff1a;内存保护的主要任务是确保每…

LeetCode热题100——双指针

双指针 1.移动零2.盛最多水的容器3.三数之和 1.移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 // 题解&#xff1a;使用双指针&#xff0c;其中快指针指向非零元素&#xff0c;慢指针指向首个零元素下…

msvcp120.dll怎么修复,五种方法教你如何修复msvcp120.dll文件

在运行软件时&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“由于找不到msvcp120.dll无法继续执行代码”。这个错误通常发生在使用Microsoft Visual C 2013编译的程序运行时。本文将介绍5种修复这个问题的方法&#xff0c;帮助各位解决这个困扰。 方法一、使…

如何使用批量重命名的方法替换重复文件名内容

在文件管理过程中&#xff0c;我们有时会遇到文件名中包含相同部分内容的情况&#xff0c;这不仅会使文件显得混乱&#xff0c;而且还会给文件检索和使用带来不便。为了解决这个问题&#xff0c;我们可以使用云炫文件管理器批量重命名进行批量替换。下面是如何使用这种方法进行…

RT-Thread入门

1、初识RT-Thread RT-Thread&#xff0c;全称是Real Time-Thread&#xff0c;即嵌入式实时多线程操作系统。其基本属性之一是支持多任务&#xff0c;但是允许多任务同时运行&#xff0c;但是并不是意味着处理器在同一时刻真的执行了多个任务。实际上&#xff0c;一个处理器核心…

mac 安装homebrew ,golang

mac 安装homebrew ,golang 安装homebrew安装golang选择 apple arm 版本安装配置环境变量 安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"回车执行指令后&#xff0c;根据提示操作。具体包括以下提示操作&am…

深度学习(4)---生成式对抗网络(GAN)

文章目录 一、原理讲述1.1 概念讲解1.2 生成模型和判别模型 二、训练过程2.1 训练原理2.2 损失函数 三、应用 一、原理讲述 1.1 概念讲解 1. 生成式对抗网络&#xff08;Generative Adversarial Network&#xff0c;GAN&#xff09;是一种深度学习模型&#xff0c;是近年来复杂…

vue vant van-uploader使用compressorjs解决拍照上传的图片被旋转 90 度方法,图片压缩上传

vue vant van-uploader使用compressorjs解决拍照上传的图片被旋转 90 度方法&#xff0c;图片压缩上传_van-uploader 拍照上传服务器后图片翻转-CSDN博客文章浏览阅读3.2k次&#xff0c;点赞4次&#xff0c;收藏6次。van-uploader使用compressorjs解决拍照上传的图片被旋转 90 …

游戏找不到x3daudio1_7.dll无法继续执行的解决方法,快速解决dll问题

x3daudio1_7.dll是一个音频处理库&#xff0c;主要用于实现三维音频渲染。它包含了微软的XAudio2音频API&#xff0c;该API被许多游戏和应用程序用于实现高质量的音频效果。这个库文件主要处理音频的空间定位、响度均衡以及多通道音频输出等功能。在游戏中&#xff0c;它可以为…

08 MIT线性代数-求解Ax=b:可解性与结构Complete Solution of Ax=b

1. 可解的条件 Solvability conditions on b 检验Axb是否可解的方法是对增广矩阵进行行消元。如果矩阵A的行被完全消去的话&#xff0c;则对应的b的分量也要得0 两条关于b的限制条件(等价) 1. if a comb. of rows of A gives zero row, then same comb. of enties of b must …

笔记46:ResNeXt 网络详解

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\2.图像处理任务\ResNeXt网络学习 a a a a a a a a a a a a a a

【论文阅读VLDB23】Online Schema Evolution is (Almost) Free for Snapshot Databases

Online Schema Evolution is (Almost) Free for Snapshot Databases 对snapshot DB来说可以几乎在线进行schema的演变。 ABSTRACT 在现有数据库系统中&#xff0c;对在线和事务模式演变的支持仍然具有挑战性。之前处理这种schema 演变基本是patches补丁的方式来做&#xff0…

实战授权码登录流程

我是经常阅读公众号优质文章&#xff0c;也经常体验到公众号的授权登录功能。今天就来实现下&#xff0c;流程图如下 效果图 后端接口 主要用来接收微信服务器推送的公众号用户触发的事件、生成和验证授权码的有效性 解析微信服务器推送的事件通知 public String login(Se…

深度强化学习用于博弈类游戏-基础测试与说明【1】

深度强化学习用于博弈类游戏-基础【1】 1. 强化学习方法2. 强化学习在LOL中的应⽤2.1 环境搭建2.2 游戏特征元素提取1)小地图人物位置&#xff1a;2)人物血量等信息3)在整个图像上寻找小兵、防御塔的位置4&#xff09;自编码器提取 3. 策略梯度算法简介参考资料 1. 强化学习方法…

工程建筑模板厂家货源,酚醛胶镜面胶合板实用型

作为工程建筑模板厂家&#xff0c;我们提供高品质的酚醛胶镜面胶合板&#xff0c;为建筑行业的模板需求提供可靠的货源。我们的产品以实用型为设计理念&#xff0c;旨在满足各类工程的施工需求并提供出色的性能。我们的酚醛胶镜面胶合板采用优质的木材作为原材料&#xff0c;经…

负载均衡的综合部署练习(hproxy+keepalived和lvs-DR+keepalived+nginx+Tomcat)

一、haproxykeepalived haproxy 2台 20.0.0.21 20.0.0.22 nginx 2台 20.0.0.23 20.0.0.24 客户机 1台 20.0.0.30 这里没有haproxy不是集群的概念&#xff0c;他只是代理服务器。 访问他直接可以直接访问后端服务器 关闭防火墙 安装haproxy和环境&#xff1a; yum in…

数据结构-初识泛型

写在前&#xff1a; 这一篇博客主要来初步的记录以下泛型的相关内容&#xff0c;内容比较琐碎&#xff0c;就不进行目录的整合&#xff0c;后续可能会对泛型这里进行系统性的梳理&#xff0c;此篇博客主要是对泛型有一个简单的认识与理解&#xff0c;需要知晓的内容。 当我调用…