IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 流场可视化工程dlb-dynamicdr部署日志:阶段一: 库安装部署 -> 正文阅读

[开发工具]流场可视化工程dlb-dynamicdr部署日志:阶段一: 库安装部署

2022-02-21

工程依赖库下载

  • Boost:

    • Required:1.53.0 or later version
    • Current:1.78.0
    • Download Link:https://www.boost.org/users/download/
  • CMake:

    • Required:2.8.12 or later version
    • Current:3.23.0
    • Download Link:https://cmake.org/download/
  • GCC/G++:

    • Required:4.8.5
    • Current:11.2.0
    • Download Link:https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/
  • METIS:

    • Required:5.1.0
    • Current:5.1.0
    • Download Link:http://glaros.dtc.umn.edu/gkhome/metis/metis/download
  • ParMETIS:

    • Required:4.0.3
    • Current:4.0.3
    • Download Link:http://glaros.dtc.umn.edu/gkhome/metis/parmetis/download
  • MPI(MPICH):

    • Required:2.1.9 or later version
    • Current:4.0
    • Download Link:https://www.mpich.org/downloads/
  • MPI(OpenMPI):

    • Required:2.1.9 or later version
    • Current:4.1.2
    • Download Link:https://www.open-mpi.org/software/ompi/v4.1/
  • NetCDF:

    • Required:4.4.0 or later version
    • Current:4.8.1
    • Download Link:https://www.unidata.ucar.edu/downloads/netcdf/
  • Parallel NetCDF:

    • Required:1.6.0 or later version
    • Current:1.12.2
    • Download Link:http://cucis.ece.northwestern.edu/projects/PnetCDF/download.html
  • Zoltan:

    • Required:3.83
    • Current:3.83
    • Download Link:https://github.com/sandialabs/Zoltan/releases

2022-02-22

本地编译、部署 :

  • CMake(3.23.0)
  • MPI(OpenMPI 4.1.2)
  • NetCDF(4.8.1)
    • 依赖:HDF5

CMake部署

库源文件路径:/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/cmake-3.22.2
安装路径(默认):/usr/local

MPI部署

同上

NetCDF部署

同上,出现错误:需要hdf5依赖

2022-02-23

今天重新安装,将之前所有文件卸载,清除/usr/local文件夹下的所有安装过的文件

当前状况记录:

ctrtemp@ctrtemp-HP-Spectre-x360-Convertible-14-ea0xxx:/usr/local$ tree
.
├── bin
├── doc
├── etc
├── games
├── include
├── lib
├── sbin
├── share
└── src

可见全为空,之后我们开始我们的部署工作

CMake部署

在这里我们使用的版本号为:3.22.2

首先测试有没有删干净:

执行
$ cmake --version 
发现无该命令

进行安装,来到目标地址

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake
$ tar -zxvf cmake-3.22.2.tar.gz 
$ mkdir installed // 用于承接之后的CMake安装文件
$ cd cmake-3.22.2/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed
//指定安装目录,并等待几分钟
$ make 
//等待几分钟~十几分钟
$ make install
//等待几秒钟

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed
$ tree
.
├── bin
├── doc
└── share
//这里省略了内部细节

之后对环境变量进行设置,从而让我们可以使用cmake命令

$ code /etc/profile
//这里我安装了VScode作为文本编辑器,当然你也可以使用Ubuntu自带的vim进行编辑

在最后几行加入

export CMake=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed

export PATH=$PATH:$CMake/bin

超级用户模式保存(sudo模式)后变量仍未生效,重启或注销用户重新登录后生效。
测试命令cmake,得到结果如下:

$ cmake --version
cmake version 3.22.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

可见与我们安装的版本号相同,CMake安装成功。

观察

这里之前我一直有一个困惑,关于CMakeLists中的find_package()语句需要寻找的FindXXX.cmake是否是在程序安装的时候动态生成的,实则不然,在我没有安装MPI、HDF5等库文件时,发现在CMake目录下的Modules中就已经有了这些FindMPI.cmake、FindHDF5.cmake等文件。

之后在你安装其他库文件的时候可以尽量注意一下这个问题。

/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed/share/cmake-3.22/Modules
//以上是Modules路径,里面存储着各种FindXXX.cmake的找包程序,可以写成如下形式
/你的CMake的安装路径(configure阶段prefix之后的值)/shared/cmake-(版本号)/Modules

MPI部署

在这里我们使用OpenMPI

版本号为:4.1.2

同样先进行测试,命令是否删除干净:

$ mpirun --version
Command 'mpirun' not found, but can be installed with:
......

命令不存在,可以开始我们的安装,安装步骤与之前的CMake基本一致,如下:

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI
$ tar -zxvf openmpi-4.1.2.tar.gz 
$ mkdir installed // 用于承接之后的CMake安装文件
$ cd openmpi-4.1.2/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed
//指定安装目录,并等待几分钟
$ make 
//等待几分钟~十几分钟
$ make install
//等待几秒钟

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed
$ tree
.
├── bin
├── etc
├── include
├── lib
└── share
//这里省略了内部细节

安装完毕后同样进行测试,流程与以上的CMake基本一致,需要修改/etc/profile文件:

$ code /etc/profile
//这里我安装了VScode作为文本编辑器,当然你也可以使用Ubuntu自带的vim进行编辑

在最后几行加入(这里与CMake略有不同的是需要为库文件和头文件添加路径)

export MPI=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed

export PATH=$PATH:$MPI/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPI/lib
export CPATH=:$CPATH:$MPI/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$MPI/include

同样注销账户后重新登录,使变量生效,进行对mpi的测试如下:

$ mpirun --version
mpirun (Open MPI) 4.1.2

Report bugs to http://www.open-mpi.org/community/help/

进一步测试1

打开test工程(就是一个简单的用cmake编译的hello-world程序),测试CMake,在CMakeLists.txt中使用find_package()命令寻找MPI。已知的前提是在CMake自带的Module路径下有FindXXX.cmake文件。CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(PRJ_Name_Any LANGUAGES CXX)

add_executable(test_exe_name test.cpp)

find_package(MPI REQUIRED)

执行cmake直接报错信息如下:

//反正就是类似于以下的错误吧,具体报错跳过了,现在已经无法找到了
xxxx(missing CXX_FLAGS)xxxx
CMake Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake

进一步测试2

打开之前RayTracing相关的并行程序,进行实际工程测试:

$ mpirun -np 4 ./runable/MPI_Ligtht

报错如下:

./MPI_Lights: error while loading shared libraries: libmpi.so.40: cannot open shared object file: No such file or directory
./MPI_Lights: error while loading shared libraries: libmpi.so.40: cannot open shared object file: No such file or directory
./MPI_Lights: error while loading shared libraries: libmpi.so.40: cannot open shared object file: No such file or directory
./MPI_Lights: error while loading shared libraries: libmpi.so.40: cannot open shared object file: No such file or directory
--------------------------------------------------------------------------
Primary job  terminated normally, but 1 process returned a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------

报错信息是缺少libmpi.so.40库文件,显然是没有检测到这个路径,已知的是在系统默认路径下的文件是一定可以被检测到的。

问题处理:阶段一

根据以上库缺少的问题,我们将这个文件(libmpi.so.40)copy到/usr/local/lib/目录下,看看是否可以实现相关功能。

$ sudo cp libmpi.so.40 /usr/local/lib/

再次执行以上命令后代码成功运行,未报错,说明是库没有被检测到,对其进行进一步修改。

问题处理:阶段二

检测并修改在/etc/profile中的书写方式之后发现无效。

进一步检测,输入env命令查看环境变量:

$ env
PATH=
/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/:
/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/:
/home/ctrtemp/.local/bin:/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:/usr/bin:
/sbin:/bin:
/usr/games:
/usr/local/games:
/snap/bin:
/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed/bin:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed/bin:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed/bin:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/NetCDF_C_Installed/bin:
/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/:
/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/

CPLUS_INCLUDE_PATH=:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed/include:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed/include:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed/include:
/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/NetCDF_C_Installed/include

LD_LIBRARY_PATH=/home/ctrtemp/Documents/cpp_code_Lib/oneTBB/oneTBB-2021.3.0/build/src/tbbmalloc

可见以上的PATH、CPLUS_INCLUDE_PATH均是更新过的结果,唯独LD_LIBRARY_PATH似乎没有被更新,这里进一步验证了我们的主要错误实际上是没有找到库目录,没有合理地为LD_LIBRARY_PATH添加变量。

问题处理:阶段三

既然/etc/profile中更新环境变量无效,我们尝试对.bashrc文件进行查看并修改

$ cd 
$ code .bashrc

.bashrc的关键字段如下:

PATH=$PATH:/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/

LD_LIBRARY_PATH="/home/ctrtemp/Documents/cpp_code_Lib/oneTBB/oneTBB-2021.3.0/build/src/tbbmalloc"

export PATH=/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/:$PATH

发现这里的LD_LIBRARY_PATH和我们之前查看env变量时展现的结果是一致的。说明修改.bashrc文件有可能可以对环境变量造成改变。于是修改后的字段如下(添加MPI的lib)

PATH=$PATH:/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed/lib/:$LD_LIBRARY_PATH

export PATH=/home/ctrtemp/Documents/cpp_code_Lib/cmake/cmake-3.21.0-linux-x86_64/bin/:$PATH

执行以下使其生效

$ source .bashrc
$ sudo ldconfig

再次使用env查看环境变量发现已经达到了我们想要的效果,但执行以上的两个测试时还是无法运行(测试一代码跑步起来;测试二检测不到MPI库位置,编译不通过)。于是注销后重新登录,以上问题解决,两个测试均跑通。

NetCDF部署

NetCDF阶段一

大致流程一致:
这里需要说明,虽然我们的工程使用C++语书写,但NetCDF的C++部分需要C语言库的支持,故这里先讲解C语言部分的编译如下:
C语言版本:4.8.1

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF
$ tar -zxvf netcdf-c-4.8.1.tar.gz 
$ mkdir installed_C // 安装文件在这里,这是NetCDF的C语言版本
$ cd netcdf-c-4.8.1/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C

执行到以上configure阶段会报错,报错信息如下:

checking for library containing H5Fflush... no
configure: error: Can't find or link to the hdf5 library. Use --disable-hdf5, or see config.log for errors.

即工程默认需要HDF5库依赖,但是现在找不到HDF5,需要安装依赖或选择不依赖HDF5。我们选择先进行HDF5的部署

HDF5部署

由于HDF5是NetCDF的编译依赖之一,故这里我们编译HDF5

大致编译流程一致

HDF5版本:1.12.0

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5
$ tar -zxvf hdf5-1.12.0.tar.gz
$ mkdir installed // 用于承接之后的CMake安装文件
$ cd hdf5-1.12.0/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed --enable-cxx //注意这里要使能C++语言,相比其他库多这个选项
//指定安装目录,并等待几分钟
$ make 
//等待几分钟~十几分钟
$ make install
//等待几秒钟

进入installed目录查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed
$ tree
.
├── bin
├── include
├── lib
└── share
//这里省略了内部细节

修改/etc/profile如下:

export HDF5=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed

export PATH=$PATH:$HDF5/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HDF5/lib
export CPATH=:$CPATH:$HDF5/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$HDF5/include

注销后测试:
同样的,bin文件夹下的可执行文件可以运行,但find_package()同样失败,检查发现LD_LIBRARY_PATH还是没有百加入环境变量。同样使用之前相同的方法进行解决:修改.bashrc文件,添加如下:

export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed/lib/:$LD_LIBRARY_PATH

注销后重新登录,env命令可以查找到hdf5,但find_package()仍然报错如下:

CMake Error at /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed/share/cmake-3.22/Modules/FindHDF5.cmake:241 (try_compile):
  Unknown extension ".c" for file

    /home/ctrtemp/Desktop/test/build/CMakeFiles/hdf5/cmake_hdf5_test.c

  try_compile() works only for enabled languages.  Currently these are:

    CXX

  See project() command to enable other languages.
Call Stack (most recent call first):
  /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed/share/cmake-3.22/Modules/FindHDF5.cmake:596 (_HDF5_test_regular_compiler_C)
  CMakeLists.txt:12 (find_package)

# 不过仍然显示找到了hdf5库
-- Found HDF5: /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed/lib/libhdf5.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libm.so (found version "1.12.0")  

这里我们查看了CMake官方文档,找到FindHDF5.cmake部分,发现其只会默认的寻找C语言的版本,而我们刚刚编译的hdf5库仅仅使能了CXX,故在这里我们需要对HDF5的find_package()进行设置。如下:

官方文档链接find_package(HDF5)报错解决(官方文档)

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(PRJ_Name_Any LANGUAGES CXX)

add_executable(test_exe_name test.cpp)

find_package(MPI REQUIRED)

find_package(HDF5 COMPONENTS CXX REQUIRED) 

编译通过

NetCDF阶段二

继续进行NetCDF的编译

//接阶段一
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C

发现和之前的报错相同!看了一些网上的解答后,有如下的方式可用以解决这个问题:
原解答地址:解决NetCDF依赖找不到HDF5的报错问题

$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C LDFLAGS=-L/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed/lib CPPFLAGS=-I/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/hdf5/installed/include

问题解决,继续编译

$ make 
//等待几分钟~十几分钟
$ make install
//等待几秒钟

查看installed_C目录

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed
$ tree
.
├── bin
├── include
├── lib
└── share
//这里省略了内部细节

添加环境变量:

profile:

export NetCDF=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C

export PATH=$PATH:$NetCDF/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NetCDF/lib
export CPATH=:$CPATH:$NetCDF/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NetCDF/include

.bashrc

export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C/lib/:$LD_LIBRARY_PATH

注销账户后重新登录,检查env没毛病,进入下一步。

2022-02-24

NetCDF阶段三

这一阶段主要是针对find_package(NetCDF),但与之前的库不同,这个文件需要我们自己找或者自己写,且NetCDF库本身没有提供这个文档。

一般来说某个库/工程文件如果有对某些库的依赖,那么它将会提供对该库的FindXXX.cmake文件,但在我们自己的工程中就必须要自己写或者直接拿其他人写好的FindXXX.cmake。这里我们的工程提供了这个cmake文件,我们直接copy一份到CMake的Module中,看看是否可用。

首先对CMake的Module目录进行查看,确定没有FindNetCDF.cmake文件,之后对我们之前创建的工程使用find_package(NetCDF REQUIRED)进行编译,查看报错情况。显然这是没有找到cmake文件的报错。

$ cmake ..
CMake Error at CMakeLists.txt:11 (find_package):
  By not providing "FindNetCDF.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "NetCDF", but
  CMake did not find one.

  Could not find a package configuration file provided by "NetCDF" with any
  of the following names:

    NetCDFConfig.cmake
    netcdf-config.cmake

  Add the installation prefix of "NetCDF" to CMAKE_PREFIX_PATH or set
  "NetCDF_DIR" to a directory containing one of the above files.  If "NetCDF"
  provides a separate development package or SDK, be sure it has been
  installed.

之后复制一份FindNetCDF.cmake到CMake的Module目录下,再次对以上执行验证。

仍有报错,信息如下:

CMake Error at /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed/share/cmake-3.22/Modules/FindNetCDF.cmake:29 (MESSAGE):
  Could not find NETCDF
Call Stack (most recent call first):
  CMakeLists.txt:11 (find_package)

似乎没有什么有用的信息,我们换一个FindNetCDF.cmake??

先考虑FindNetCDF.cmake文件的书写问题,我们打开该文件进行查看:

FIND_PATH(NetCDF_INCLUDE_DIR netcfd.h)//指定include搜索路径

FIND_LIBRARY(NetCDF_LIBRARY NAMES netcdf) //指定library搜索路径

IF (NetCDF_INCLUDE_DIR AND NetCDF_LIBRARY)
  SET(NetCDF_FOUND TRUE)
ENDIF (NetCDF_INCLUDE_DIR AND NetCDF_LIBRARY)

IF (NetCDF_FOUND)
   IF (NOT NetCDF_FIND_QUIETLY)
      MESSAGE(STATUS "Found NETCDF: ${NetCDF_LIBRARY}")
   ENDIF (NOT NetCDF_FIND_QUIETLY)
ELSE (NetCDF_FOUND)
   IF (NetCDF_FIND_REQUIRED)
      MESSAGE(FATAL_ERROR "Could not find NETCDF")
   ENDIF (NetCDF_FIND_REQUIRED)
ENDIF (NetCDF_FOUND)

以上我们看到了指定的搜索路径,故我们应该在环境变量中添加这两个变量,并为其指定好对应的路径,以下对/etc/profile文件进行修改,添加如下语句:

export NetCDF_INCLUDE_DIR=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C/include

export NetCDF_LIBRARY=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C/lib

注销账户后重新登录再次进行测试。

重新登录后,虽然使用env命令查看,环境变量中存在NetCDF_INCLUDE_DIR和NetCDF_LIBRARY,但cmake测试工程中的find_package()还是无法通过。

此时我们不妨直接修改FindNetCDF.cmake文件,对搜素路径直接进行设置如下:

set(NetCDF_INCLUDE_DIR /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C/include)

set(NetCDF_LIBRARY /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_C/lib)

再次编译,成功。?!不成立,这个命令不是这么用的,这里有点自欺欺人了。

关于FindXXX.cmake文件中的命令详解

这里遇到了几个问题,需要解决,理解FIND_PATH以及FIND_LIBRARY命令后继续进行编译。

FIND_PATH()命令

解释如下:直接放链接:
官方链接:FIND_PATH()官方命令解析
其他链接:一个有用的解释

我使用的命令:
大体意思就是NetCDF_INCLUDE_DIR是一个我们设置的变量var,NAMES关键字符跟一个我们要找的文件名,PATH后面跟我们要找的文件的搜索路径,如果找到了,则将最开始的NetCDF_INCLUDE_DIR设置为找到的路径位置,如果非,返回一个NetCDF_INCLUDE_DIR-NOTFOUND。
ENV关键字可以让我们使用环境变量中的变量名。

FIND_PATH(NetCDF_INCLUDE_DIR  NAMES netcdf.h PATHS "$ENV{CPLUS_INCLUDE_PATH}")
Message(STATUS "${NetCDF_INCLUDE_DIR}")
......
IF(NetCDF_INCLUDE_DIR)
   MESSAGE(STATUS "Header Found")
ELSE()
   MESSAGE(STATUS "Header Not Found")
ENDIF()

搜索后没有找到,打印

-- NetCDF_INCLUDE_DIR-NOTFOUND
-- Header Not Found

尝试找一个基本库的头文件,比如stdio.h,找到了,打印

-- /usr/include/
-- Header Found

但是当我继续寻找netcdf.h文件时,发现返回的仍然是上面的两行。找一下原因发现:这是由于FIND_PATH()命令一旦找到过文件,再次运行cmake时这条语句不会被重复执行,故可以清除cache(删除整个build下的所有文件)后使用NO_CACHE标志如下:

FIND_PATH(NetCDF_INCLUDE_DIR  NAMES netcdf.h PATHS "$ENV{CPLUS_INCLUDE_PATH}" NO_CACHE)
Message(STATUS "${NetCDF_INCLUDE_DIR}")
......
IF(NetCDF_INCLUDE_DIR)
   MESSAGE(STATUS "Header Found")
ELSE()
   MESSAGE(STATUS "Header Not Found")
ENDIF()

这样在调试阶段,我们就可以重复修改需要寻找的库,并且FIND_PATH()语句每次都会被重复执行。这主要是方便了我们的调试过程。

接下来反复修改,发现我们放置在/usr/lib/以及/usr/local/lib/中的文件总能被找到,即使不加后面的PATH指令。但是使用在ENV中的变量寻找却总也找不到。如下:

FIND_PATH(NetCDF_INCLUDE_DIR  NAMES  stdio.h  NO_CACHE)
//这种即使没有给PATH也可以找得到
FIND_PATH(NetCDF_INCLUDE_DIR  
            NAMES mpi.h 
            PATHS /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed/include 
            NO_CACHE
            )
//这种给直接给位置的可以找得到
FIND_PATH(NetCDF_INCLUDE_DIR  
            NAMES netcdf.h 
            PATHS "$ENV{NetCDF_INCLUDE_DIR}
            NO_CACHE
            )
//这种给ENV中变量,但变量只包含一个目标地址的可以找得到
FIND_PATH(NetCDF_INCLUDE_DIR  
            NAMES netcdf.h 
            PATHS "$ENV{CPLUS_INCLUDE_PATH}"
            NO_CACHE
            )
//这种给ENV中变量,但变量是一个地址list集合的就找不到

目前情况就是如此,暂且跳过这里

FIND_LIBRARY()命令

与以上用法大同小异,不作详细介绍

NetCDF阶段四

NetCDF-C编译通过后,尝试对NetCDF-CXX进行编译

NetCDF-CXX 版本 4.3.1

过程大同小异,如下:

进行安装,来到目标地址

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF
$ tar -zxvf netcdf-cxx4-4.3.1.tar.gz
$ mkdir installed // 用于承接之后的CMake安装文件
$ cd netcdf-cxx4-4.3.1/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_CXX
//指定安装目录,并等待几分钟
$ make 
//等待几分钟~十几分钟
$ make install
//等待几秒钟

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_CXX
$ tree
.
├── bin
├── include
└── lib
//这里省略了内部细节

之后对环境变量进行设置,从而让我们可以使用cmake命令

$ code /etc/profile
//这里我安装了VScode作为文本编辑器,当然你也可以使用Ubuntu自带的vim进行编辑

在最后几行加入

export NetCDF_CXX=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_CXX

export PATH=$PATH:$NetCDF_CXX/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NetCDF_CXX/lib
export CPATH=:$CPATH:$NetCDF_CXX/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NetCDF_CXX/include

同样在.bashrc中修改,加上如下语句

export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/NetCDF/installed_CXX/lib/:$LD_LIBRARY_PATH # NetCDF_CXX

注销后重新登录,进行测试。

bin文件夹中的可执行文件测试通过。

Boost部署

Boost 版本 1.78.0

过程大同小异,如下:

进行安装,来到目标地址

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost
$ tar -zxvf boost_1_78_0.tar.gz
$ mkdir installed // 用于承接之后的CMake安装文件
$ cd boost_1_78_0/
//注意这里不需要新建一个build文件夹,因为一些配置文件是需要的
//如果在新的build文件夹下可能会导致jam文件找不到而无法展开下一步编译
$ ./bootstrap.sh --with-libraries=all --with-toolset=gcc --prefix=home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/installed
//指定安装目录,并等待几分钟,注意这里有区别,使用的不是configure文件,且一些参数需要设置
$ ./b2 -j4 //开多核编译 
//等待十几分钟
$ ./b2 install
//等待几秒钟

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/installed
$ tree
//没东西!

发现这里的安装路径并没有向我们设置的那样,并且在执行完./b2 -j4命令后有如下的命令行提示:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

    /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/boost_1_78_0

The following directory should be added to linker library paths:

    /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/boost_1_78_0/stage/lib

我们可以按照以上的提示对/etc/profile/以及.bashrc进行添加修改如下:

//profile
export CPATH=$CPATH:/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/boost_1_78_0
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/boost_1_78_0
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/boost_1_78_0/stage/lib/:$LD_LIBRARY_PATH # BOOST

注销后重新登录,检测env,通过。(这里没有其他的检测手段)

2022-02-25补充(Boost部署)

想到之前配置METIS的时候,使用的相对路径发现的确这里配置安装路径的时候也是相对路径,故根目录会出现一个home文件夹,这是不对的,我们还是要让其安装到我们指定的文件夹下,修改如下:

$ cd boost_1_78_0/
//注意这里不需要新建一个build文件夹,因为一些配置文件是需要的
//如果在新的build文件夹下可能会导致jam文件找不到而无法展开下一步编译
$ ./bootstrap.sh --with-libraries=all --with-toolset=gcc --prefix=../installed  
//注意这里是相对路径了
//指定安装目录,并等待几分钟,注意这里有区别,使用的不是configure文件,且一些参数需要设置
$ ./b2 -j4 //开多核编译 
//等待几分钟
$ ./b2 install
//等待几秒钟

查看installed文件夹下:

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/installed
$ tree
.
├── include
└── lib
//这里省略了内部细节

同样修改/etc/profile和.bashrc如下:

//profile
export Boost=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/installed

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Boost/lib
export CPATH=$CPATH:$Boost/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$Boost/include
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Boost/installed/lib/:$LD_LIBRARY_PATH # BOOST

注销后重新登录,检测env,通过。(这里没有其他的检测手段)

Protobuf部署

与之前的部署大同小异

Protobuf版本:3.19.4

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Protobuf
$  tar -zxvf protobuf-cpp-3.19.4.tar.gz 
$ mkdir installed // 用于承接之后的安装文件
$ cd protobuf-3.19.4/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Protobuf/installed
//指定安装目录,并等待一分钟
$ make 
//等待几分钟~十几分钟
//这里中间出现了一次内存空间不够的错误,整理清除部分内存后解决
$ make install
//等待几分钟
//中间再次空间不足的报错,同样需要进行内存清理

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Protobuf/installed
$ tree
.
├── bin
├── include
└── lib
//这里省略了内部细节

对/etc/profile和.bashrc进行设置

//protobuf
export Protobuf=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Protobuf/installed

export PATH=$PATH:$Protobuf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Protobuf/lib
export CPATH=$CPATH:$Protobuf/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$Protobuf/include
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Protobuf/installed/lib/:$LD_LIBRARY_PATH # Protobuf

注销账户后重新登录进行验证,成功(env以及bin目录下的可执行文件运行)

Zoltan部署

大同小异

Zoltan版本3.83

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Protobuf
$ tar -zxvf Zoltan-3.83.tar.gz
$ mkdir installed // 用于承接之后的安装文件
$ cd Zoltan-3.83/
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed
//指定安装目录,并等待几秒钟
$ make 
//等待一分钟
$ make install
//等待几秒钟

之后进入安装目录进行查看

$ cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed
$ tree
.
├── include
└── lib
//这里省略了内部细节

对/etc/profile和.bashrc进行设置

//protobuf
export Zoltan=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Zoltan/lib
export CPATH=$CPATH:$Zoltan/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$Zoltan/include
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed/lib/:$LD_LIBRARY_PATH

注销账户后重新登录进行验证,成功(env环境变量查看测试)

METIS部署

大同小异

METIS版本5.1.0

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS
$ tar -zxvf metis-5.1.0.tar.gz 
$ mkdir installed // 用于承接之后的安装文件
$ cd metis-5.1.0/
$ sudo make config shared=1 cc=gcc prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/installed //这里略有不同

这里出现问题报错如下:

rm -rf build/Linux-x86_64
mkdir -p build/Linux-x86_64
cd build/Linux-x86_64 && cmake /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/metis-5.1.0 -DCMAKE_VERBOSE_MAKEFILE=1 -DGKLIB_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/metis-5.1.0/GKlib -DCMAKE_INSTALL_PREFIX=home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/installed -DSHARED=1 -DCMAKE_C_COMPILER=gcc
/bin/sh: 1: cmake: not found
make: *** [Makefile:74:config] 错误 127

仔细分析以下发现其实这个make config也是在执行一组命令,而阻挠程序继续运行的是cmake命令找不到。但是cmake命令怎么可能找不到呢?于是在命令行中敲击cmake发现是有命令的,但摸索一下之后发现是sudo cmake权限不够造成的,借鉴后解决,成功运行。

借鉴链接:cmake命令没有sudo权限d额解决

$ sudo make install //等待几秒钟安装完毕

之后发现安装路径完全错误,打开/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/installed之后发现里面没有任何文件。最后检查到文件的prefix设置的是相对路径,也就是它会在mkdir -p build/Linux-x86_64命令后,在在这个Linux-x86_64文件夹下创建路径/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/installed,这显然不符合我们的预期,于是将使用…/回退到根目录下的installed目录,命令如下:

......
$ sudo make config shared=1 cc=gcc prefix=../../../installed
......
$ cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/METIS/installed
$ tree
.
├── bin
├── include
└── lib

成功安装,之后修改/etc/profile以及.bashrc。如下:

//protobuf
export Zoltan=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Zoltan/lib
export CPATH=$CPATH:$Zoltan/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$Zoltan/include
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Zoltan/installed/lib/:$LD_LIBRARY_PATH

注销账户后重新登录进行验证,成功(env环境变量查看测试以及bin文件夹下的可执行文件测试)

2022-02-25

Parallel_NetCDF 部署

Parallel_NetCDF版本:1.12.2

进行安装,来到目标地址

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Parallel_NetCDF
$ tar -zxvf pnetcdf-1.12.2.tar.gz  
$ mkdir installed // 用于承接之后的安装文件
$ cd pnetcdf-1.12.2
$ mkdir build
$ cd build/
$ ../configure --prefix=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Parallel_NetCDF/installed
//指定安装目录,并等待几分钟
$ make 
//等待几分钟
$ make install
//等待几秒钟

configure阶段结束后打印的关键信息:注意这里没有编译动态库:

------------------------------------------------------------------------------

   PnetCDF Version 1.12.2

   Features:  Build static libraries                      - yes
              Build shared libraries                      - no
              Build Fortran APIs                          - yes
              Build C++ APIs                              - yes

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/CMake/installed
$ tree
.
├── bin
├── include
├── lib
└── share
//这里省略了内部细节

修改/etc/profile文件以及.bashrc如下:

//profile
export Parallel_NetCDF=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Parallel_NetCDF/installed

export PATH=$PATH:$Parallel_NetCDF/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Parallel_NetCDF/lib
export CPATH=$CPATH:$Parallel_NetCDF/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$Parallel_NetCDF/include
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/Parallel_NetCDF/installed/lib/:$LD_LIBRARY_PATH # Parallel_NetCDF

注销后重新登录,验证成功。

ParMETIS部署

ParMETIS版本:4.0.3

进行安装,来到目标地址

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS
$ tar -zxvf parmetis-4.0.3.tar.gz  
$ mkdir installed // 用于承接之后的安装文件
$ cd parmetis-4.0.3
$ sudo make config shared=1 cc=gcc prefix=../../../installed
//这里和之前的METIS的部署方式是一致的



本阶段存在报错如下:

CMake Error at CMakeLists.txt:2 (project):
  The CMAKE_CXX_COMPILER:

  mpicxx

  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.

首先设置计算机位数(默认32位机器我们改成64位)
参考文章修改机器位32~64

分析应该是没有找到MPI编译器,我们继续看,根据之前对METIS的编译,我们知道编译过程实际上是在执行一串指令如下:

$ cd build/
$ cd Linux-x86_64/
$ sudo make config shared=1 prefix=../../../installed
rm -rf build/Linux-x86_64
mkdir -p build/Linux-x86_64
cd build/Linux-x86_64 && cmake /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/parmetis-4.0.3 -DCMAKE_VERBOSE_MAKEFILE=1 -DGKLIB_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/parmetis-4.0.3/metis/GKlib -DMETIS_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/parmetis-4.0.3/metis -DCMAKE_INSTALL_PREFIX=../../../installed -DSHARED=1 -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx

编译报错结果说的其实是最后的cmake命令部分,没有找到CMAKE_C_COMPILER和CMAKE_CXX_COMPILER,说mpicc和mpicxx命令路径必须给一个绝对路径,那么我们按照它说的分步骤执行就可以了,如下:

$ sudo cmake /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/parmetis-4.0.3 -DCMAKE_VERBOSE_MAKEFILE=1 -DGKLIB_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/parmetis-4.0.3/metis/GKlib -DMETIS_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/parmetis-4.0.3/metis -DCMAKE_INSTALL_PREFIX=../../../installed -DSHARED=1 -DCMAKE_C_COMPILER=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed/bin/mpicc -DCMAKE_CXX_COMPILER=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/MPI/OpenMPI/installed/bin/mpicxx

成功,接下来执行:

$ sudo make //几秒钟
$ sudo make install //几秒钟

之后进入安装目录进行查看

cd /home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/installed
$ tree
.
├── bin
├── include
└── lib
//这里省略了内部细节

对/etc/profile和.bashrc进行修改如下:

//profile
export ParMETIS=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/installed

export PATH=$PATH:$ParMETIS/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ParMETIS/lib
export CPATH=$CPATH:$ParMETIS/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$ParMETIS/include
//.bashrc
export LD_LIBRARY_PATH=/home/ctrtemp/Downloads/Lib/CppLib/dlb-lib/ParMETIS/installed/lib/:$LD_LIBRARY_PATH # ParMETIS

注销后重新登录,验证成功。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:50:46  更:2022-02-26 11:51:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:52:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码