Ubuntu 20.04安装ipopt和cppAD(安装全流程+报错解决)

news2024/11/21 0:27:13

文章目录

  • 参考资料
  • 1. Ipopt安装
    • 1. 方式1: 命令行安装
    • 2. 方式2:源码安装
    • 3. 方式3:源码安装
    • 4. Ipopt测试
    • 5. 报错修复
  • 2. CppAD安装
    • 1. 方式1:命令行安装
    • 2. 方式2:源码方式安装
    • 3. CppAD测试
  • 3. 测试Ipopt与CppAD是否可用
    • 1. 例子
    • 2. 编译报错解决
      • 1. Undefined reference to `Ipopt::IpoptApplication::IpoptApplication(bool, bool)'
      • 2. fatal error: coin/IpIpoptApplication.hpp: No such file or directorycompilation terminated.

参考资料

  • https://github.com/udacity/CarND-MPC-Quizzes/blob/master/install_Ipopt_CppAD.md

  • https://blog.csdn.net/qq_34525916/article/details/119186692#:~:text=%E6%A6%82%E8%A7%88

  • https://coin-or.github.io/CppAD/doc/install.htm

  • Ubuntu20.04 安装 Ipopt + cppAD流程

  • coinor库的安装与问题解决

  • Undefined reference to `Ipopt::IpoptApplication::IpoptApplication(bool, bool)’

在进行cppad和ipopt的安装时,发现在按照其他博主写的博客进行安装时总是会出现各种各样他们没遇到的问题,所以这里也记录下自己成功安装的步骤。

1. Ipopt安装

这边提供3种方式进行安装,可以先尝试使用方式1,方式1不行的话尝试方式2,方式2不行最后再尝试方式3.

1. 方式1: 命令行安装

sudo apt-get install coinor-libipopt

我这边使用命令行安装时显示无法定位软件包,在更新软件源后依旧无法生效,所以这个方式我放弃了。

在这里插入图片描述

2. 方式2:源码安装

  1. 安装依赖

    sudo apt-get install gcc g++ gfortran git patch wget pkg-config liblapack-dev libmetis-dev libblas-dev 
    
  2. 创建一个存放所有跟Ipopt相关的文件夹,便于管理

    mkdir ~/Ipopt_pkg
    cd Ipopt_pkg
    
  3. 安装ASL

    git clone https://github.com/coin-or-tools/ThirdParty-ASL.git
    cd ThirdParty-ASL
    sudo ./get.ASL
    sudo ./configure
    sudo make
    sudo make install
    cd ..
    
  4. 安装HSL

    git clone https://github.com/coin-or-tools/ThirdParty-HSL.git
    cd ThirdParty-HSL
    # 接下来需要下载coinhsl文件,并解压到ThirdParty-HSL目录下
    

    下载coinhsl文件,并解压到ThirdParty-HSL目录下

    ThirdParty-HSL目录下,执行以下命令

    sudo ./configure
    sudo make
    sudo make install
    cd ..
    
  5. 安装MUMPS

    git clone https://github.com/coin-or-tools/ThirdParty-Mumps.git
    cd ThirdParty-Mumps
    sudo ./get.Mumps
    sudo ./configure
    sudo make
    sudo make install
    cd ..
    
  6. 安装Ipopt

    git clone https://github.com/coin-or/Ipopt.git
    cd Ipopt
    mkdir build
    cd build
    sudo ../configure
    sudo make
    sudo make test
    sudo make install
    
  7. 完善环境

    cd /usr/local/include
    sudo cp coin-or coin -r
    sudo ln -s /usr/local/lib/libcoinmumps.so.3 /usr/lib/libcoinmumps.so.3
    sudo ln -s /usr/local/lib/libcoinhsl.so.2 /usr/lib/libcoinhsl.so.2
    sudo ln -s /usr/local/lib/libipopt.so.3 /usr/lib/libipopt.so.3
    

到这里都没有报错则安装完成。

3. 方式3:源码安装

  1. 首先,安装依赖

    sudo apt-get install gfortran
    apt-get install unzip
    
  2. 下载Ipopt压缩包,并解压。

    wget https://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.7.zip 
    unzip Ipopt-3.12.7.zip
    

    在使用wget方式下载Ipopt压缩包时,可能因为网络原因下载不了,那么可以直接进入网址,找到Ipopt-3.12.7.zip进行手动下载即可。
    在这里插入图片描述

  3. 下载并解压完成后,进入Ipopt-3.12.7文件夹,执行新建文件 install_ipopt.sh

    touch install_ipopt.sh
    
  4. 打开该文件,并写入以下内容:

    # Pass the Ipopt source directory as the first argument
    if [ -z $1 ]
    then
        echo "Specifiy the location of the Ipopt source directory in the first argument."
        exit
    fi
    cd $1
    
    prefix=/usr/local
    srcdir=$PWD
    
    echo "Building Ipopt from ${srcdir}"
    echo "Saving headers and libraries to ${prefix}"
    
    # BLAS
    cd $srcdir/ThirdParty/Blas
    ./get.Blas
    mkdir -p build && cd build
    ../configure --prefix=$prefix --disable-shared --with-pic
    make install
    
    # Lapack
    cd $srcdir/ThirdParty/Lapack
    ./get.Lapack
    mkdir -p build && cd build
    ../configure --prefix=$prefix --disable-shared --with-pic \
        --with-blas="$prefix/lib/libcoinblas.a -lgfortran"
    make install
    
    # ASL
    cd $srcdir/ThirdParty/ASL
    ./get.ASL
    
    # MUMPS
    cd $srcdir/ThirdParty/Mumps
    ./get.Mumps
    
    # build everything
    cd $srcdir
    ./configure --prefix=$prefix coin_skip_warn_cxxflags=yes \
        --with-blas="$prefix/lib/libcoinblas.a -lgfortran" \
        --with-lapack=$prefix/lib/libcoinlapack.a
    make
    make test
    make -j1 install
    
  5. 给该文件添加可执行权限:

    sudo chmod +x install_ipopt.sh
    
  6. 然后运行脚本:

    ./install_ipopt.sh Ipopt-3.12.7
    

    运行脚本后,有可能因为网络问题运行失败,可以多尝试几次。
    在这里插入图片描述

最后静静等待安装即可。

最终,我是使用方式2步骤进行安装的。方式3因为网络问题,比较难成功。

4. Ipopt测试

进入 IPOPT 源码文件夹如下位置,用官方例子测试

cd Ipopt/build/examples/Cpp_example
sudo make
./Cpp_example

出现以下界面说明安装成功

在这里插入图片描述

5. 报错修复

安装完成后,有可能后期在使用阶段会编译报错:
在这里插入图片描述

/usr/include/coin/IpSmartPtr.hpp:19:4: error: #error "don't have header file for stddef"

需要通过以下方式解决。

打开文件

sudo gedit /usr/include/coin/IpSmartPtr.hpp

在文件的预处理部分,添加如下内容

#define HAVE_CSTDDEF // 添加部分
#ifdef HAVE_CSTDDEF
# include <cstddef>
#else
# ifdef HAVE_STDDEF_H
#  include <stddef.h>
# else
#  error "don't have header file for stddef"
# endif
#endif
#undef HAVE_CSTDDEF // 添加部分

在这里插入图片描述

2. CppAD安装

先尝试方式1,方式1不行再尝试方式2。

1. 方式1:命令行安装

一般网上已有的教程都是说直接在终端中输入以下命令安装:

sudo apt-get install cppad

但是,使用这种方式可能找不到该库。
在这里插入图片描述

遇到这个问题时,可以尝试切换源。切换源方式见博客。切换源后再进行更新。

sudo apt update

然后再重新尝试安装。

安装完成后如果需要卸载,则执行以下命令:

sudo apt-get remove cppad

如果上述方式无法成功安装,可采取下面源码的方式安装。

2. 方式2:源码方式安装

使用源码的方式安装。

  1. 下载源码:

    git clone https://github.com/coin-or/CppAD.git 
    
  2. 下载完成后,进入CppAD文件夹,然后执行以下命令:

    mkdir build
    cd build
    cmake ..
    make 
    sudo make install
    

    即可安装成功。

  3. 如果需要卸载的话,在CppAD/build文件夹内执行以下命令即可:

    	sudo make uninstall
    

3. CppAD测试

使用以下代码测试CppAD是否安装成功。

  • CppAD_demo.cpp文件

    # include <iostream>        // standard input/output
    # include <vector>          // standard vector
    # include <cppad/cppad.hpp> // the CppAD package
    
    namespace { // begin the empty namespace
        // define the function Poly(a, x) = a[0] + a[1]*x[1] + ... + a[k-1]*x[k-1]
        template <class Type>
        Type Poly(const CPPAD_TESTVECTOR(double) &a, const Type &x)
        {   size_t k  = a.size();
            Type y   = 0.;  // initialize summation
            Type x_i = 1.;  // initialize x^i
            for(size_t i = 0; i < k; i++)
            {   y   += a[i] * x_i;  // y   = y + a_i * x^i
                x_i *= x;           // x_i = x_i * x
            }
            return y;
        }
    }
    // main program
    int main(void)
    {   using CppAD::AD;   // use AD as abbreviation for CppAD::AD
        using std::vector; // use vector as abbreviation for std::vector
    
        // vector of polynomial coefficients
        size_t k = 5;                  // number of polynomial coefficients
        CPPAD_TESTVECTOR(double) a(k); // vector of polynomial coefficients
        for(size_t i = 0; i < k; i++)
            a[i] = 1.;                 // value of polynomial coefficients
    
        // domain space vector
        size_t n = 1;               // number of domain space variables
        vector< AD<double> > ax(n); // vector of domain space variables
        ax[0] = 3.;                 // value at which function is recorded
    
        // declare independent variables and start recording operation sequence
        CppAD::Independent(ax);
    
        // range space vector
        size_t m = 1;               // number of ranges space variables
        vector< AD<double> > ay(m); // vector of ranges space variables
        ay[0] = Poly(a, ax[0]);     // record operations that compute ay[0]
    
        // store operation sequence in f: X -> Y and stop recording
        CppAD::ADFun<double> f(ax, ay);
    
        // compute derivative using operation sequence stored in f
        vector<double> jac(m * n); // Jacobian of f (m by n matrix)
        vector<double> x(n);       // domain space vector
        x[0] = 3.;                 // argument value for computing derivative
        jac  = f.Jacobian(x);      // Jacobian for operation sequence
    
        // print the results
        std::cout << "f'(3) computed by CppAD = " << jac[0] << std::endl;
    
        // check if the derivative is correct
        int error_code;
        if( jac[0] == 142. )
            error_code = 0;      // return code for correct case
        else  error_code = 1;    // return code for incorrect case
    
        return error_code;
    }
    
  • CMakeLists.txt文件

    cmake_minimum_required(VERSION 3.21)
    
    project(testCPP)
    
    set(CMAKE_CXX_STANDARD 14)
    
    add_executable(CppAD_demo CppAD_demo.cpp)
    
    
  • 在该项目目录内执行

    mkdir build
    cd build
    cmake ../
    make
    ./CppAD_demo
    

    输出以下信息,则CppAD安装成功
    在这里插入图片描述

3. 测试Ipopt与CppAD是否可用

以下例子来自于博客。

1. 例子

利用CppAD与Ipopt求解以下非线性规划问题

minimize ⁡ x 1 x 4 ( x 1 + x 2 + x 3 ) + x 3  s.t.  x 1 x 2 x 3 x 4 ≥ 25 x 1 2 + x 2 2 + x 3 2 + x 4 2 = 40 1 ≤ x 1 , x 2 , x 3 , x 4 ≤ 5 \begin{array}{cc}\operatorname{minimize} & x_1 x_4\left(x_1+x_2+x_3\right)+x_3 \\ \text { s.t. } & x_1 x_2 x_3 x_4 \geq 25 \\ & x_1^2+x_2^2+x_3^2+x_4^2=40 \\ & 1 \leq x_1, x_2, x_3, x_4 \leq 5\end{array} minimize s.t. x1x4(x1+x2+x3)+x3x1x2x3x425x12+x22+x32+x42=401x1,x2,x3,x45

  • cppad_ipopt_demo.cpp文件

    #include <iostream>
    #include <cppad/ipopt/solve.hpp>
    
    using namespace std;
    
    namespace {
    using CppAD::AD;
    class FG_eval {
    public:
        typedef CPPAD_TESTVECTOR(AD<double>) ADvector;
        void operator()(ADvector& fg, const ADvector& x)
        {
            assert(fg.size() == 3);
            assert(x.size() == 4);
            // variables
            AD<double> x1 = x[0];
            AD<double> x2 = x[1];
            AD<double> x3 = x[2];
            AD<double> x4 = x[3];
            // f(x) objective function
            fg[0] = x1 * x4 * (x1 + x2 + x3) + x3;
            // constraints
            fg[1] = x1 * x2 * x3 * x4;
            fg[2] = x1 * x1 + x2 * x2 + x3 * x3 + x4 * x4;
            return;
        }
    
    };
    
    }
    
    bool get_started(void)
    {
        bool ok = true;
        size_t i;
        typedef CPPAD_TESTVECTOR(double) Dvector;
    
        size_t nx = 4; // number of varibles
        size_t ng = 2; // number of constraints
        Dvector x0(nx); // initial condition of varibles
        x0[0] = 1.0;
        x0[1] = 5.0;
        x0[2] = 5.0;
        x0[3] = 1.0;
    
        // lower and upper bounds for varibles
        Dvector xl(nx), xu(nx);
        for(i = 0; i < nx; i++)
        {
            xl[i] = 1.0;
            xu[i] = 5.0;
        }
        Dvector gl(ng), gu(ng);
        gl[0] = 25.0;    gu[0] = 1.0e19;
        gl[1] = 40.0;    gu[1] = 40.0;
        // object that computes objective and constraints
        FG_eval fg_eval;
    
        // options
        string options;
        // turn off any printing
        options += "Integer print_level  0\n";
        options += "String sb            yes\n";
        // maximum iterations
        options += "Integer max_iter     10\n";
        //approximate accuracy in first order necessary conditions;
        // see Mathematical Programming, Volume 106, Number 1,
        // Pages 25-57, Equation (6)
        options += "Numeric tol          1e-6\n";
        //derivative tesing
        options += "String derivative_test   second-order\n";
        // maximum amount of random pertubation; e.g.,
        // when evaluation finite diff
        options += "Numeric point_perturbation_radius   0.\n";
    
    
        CppAD::ipopt::solve_result<Dvector> solution; // solution
        CppAD::ipopt::solve<Dvector, FG_eval>(options, x0, xl, xu, gl, gu, fg_eval, solution); // solve the problem
    
        cout<<"solution: "<<solution.x<<endl;
    
        //
        //check some of the solution values
        //
        ok &= solution.status == CppAD::ipopt::solve_result<Dvector>::success;
        //
        double check_x[]  = {1.000000, 4.743000, 3.82115, 1.379408};
        double check_zl[] = {1.087871, 0.,       0.,       0.      };
        double check_zu[] = {0.,       0.,       0.,       0.      };
        double rel_tol    = 1e-6; // relative tolerance
        double abs_tol    = 1e-6; // absolute tolerance
        for(i = 0; i < nx; i++)
        {
            ok &= CppAD::NearEqual(
                        check_x[i], solution.x[i], rel_tol, abs_tol);
            ok &= CppAD::NearEqual(
                        check_zl[i], solution.zl[i], rel_tol, abs_tol);
            ok &= CppAD::NearEqual(
                        check_zu[i], solution.zu[i], rel_tol, abs_tol);
        }
    
        return ok;
    }
    
    int main()
    {
        cout << "CppAD : Hello World Demo!" << endl;
        get_started();
        return 0;
    }
    
  • CMakeLists.txt文件

    cmake_minimum_required(VERSION 3.21)
    project(testCPP)
    
    set(CMAKE_CXX_STANDARD 14)
    
    add_executable(cppad_ipopt_demo cppad_ipopt_demo.cpp)
    target_link_libraries(cppad_ipopt_demo ipopt)
    
  • 在该项目目录内执行

    mkdir build
    cd build
    cmake ../
    make
    ./cppad_ipopt_demo
    

    若输出如下信息,则说明Ipopt与CppAD安装成功。

    在这里插入图片描述

2. 编译报错解决

1. Undefined reference to `Ipopt::IpoptApplication::IpoptApplication(bool, bool)’

这里需要注意的是,CMakeLists.txt文件需要加入target_link_libraries(cppad_ipopt_demo ipopt)链接,否则会报如下错误:

Undefined reference to `Ipopt::IpoptApplication::IpoptApplication(bool, bool)'

在这里插入图片描述

2. fatal error: coin/IpIpoptApplication.hpp: No such file or directorycompilation terminated.

若编译后报错:

fatal error: coin/IpIpoptApplication.hpp: No such file or directorycompilation terminated.

这是由缺少coin_or库引起的,可以执行以下命令安装

sudo apt install coinor-libipopt-dev

以上所有代码存于github仓库。

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

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

相关文章

uni——app、H5省市区选择

案例演示 步骤 封装的组件&#xff0c;之后引用组件。 父&#xff1a; <pickerAddress change"change"><input type"text" placeholder"请选择所在地区" :value"value" /><image :src"$common.image(/static/p…

[附源码]java毕业设计新闻发布和评论管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

安装Jenkins

安装Jenkins jenkins官网 1、安装jdk 1&#xff09;yum安装 yum search java|grep jdk # yum查看jdk版yum install -y java-11-openjdk #安装jreyum install -y java-devel #安装jdk2&#xff09;自定义安装 ①下载java ②上传解压tar ③配置环境变量&#xff08;此步…

原生js 之 (BOM操作)

BOM(浏览器对象模型) Window对象对应着浏览器窗口本身&#xff0c;它的属性和方法通常被统称为BOM (浏览器对象模型) BOM 提供了独立于内容而与浏览器窗口进行交互的对象。 BOM主要用于管理窗口与窗口之间的通讯&#xff0c;因此其核心对象是Window BOM由一系列相关的对象组成…

Spark DAG及内存迭代计算

文章目录DAGJob与Action之间的关系DAG和分区DAG宽窄依赖DAG宽窄依赖的划分Spark内存迭代计算总结Spark是怎么做内存计算的&#xff1f;DAG的作用&#xff1f;Stage阶段划分作用&#xff1f;Spark为什么比MapReduce快&#xff1f;DAG Spark的核心是根据RDD来实现的&#xff0c;…

cubemx stm32 lu90614模块 人体温度检测模块 可以替代温枪 驱动代码

lu90614 使用串口通信在&#xff0c;指值得注意的是&#xff0c;他的TX接单片机的TX&#xff0c;RX接单片机的RX&#xff0c;和其他的串口设备不一样。 模式切换包 lu90614有两种模式&#xff0c; 一个是物温模式&#xff0c;一个是体温模式&#xff08;检测人体温度用体温…

【CSDN 竞赛—第10期】所有题目解法的思考和总结

目录 一、 熊孩子拜访 二、 走楼梯 三、括号上色 四、喜水青蛙 一、 熊孩子拜访 已知存在一个长度为n的整数序列A。 A中所有元素按照从小到达的顺序进行排序。 现在执行操作倒置一段序列。 请找到A序列里的倒置子序列。 我的解题思路&#xff08;通过所有测试用例&#xff0…

[附源码]java毕业设计星期八酒店管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Opengl ES之PBO

叨叨一句几句 关于Opengl的系列已经有较长的一段时间没有更新了&#xff0c;然而这个系列还远没有到完毕地步&#xff0c;后续至少还有关于Opengl矩阵变换、YUV与RGB互转、Opengl水印贴图、Opengl转场动画等主题文章。 断更的主要原因如果给自己找个借口的话可以说是工作比价…

1100w播放、45w涨粉!黑马UP在B站20天逆袭登顶!

在B站生活区里&#xff0c;“搞笑区”的流量独占鳌头&#xff0c;创作者也是络绎不绝。 为此&#xff0c;B站官方对搞笑内容创作布局了长期的扶持计划&#xff0c;比较热门的两个活动“搞笑新星训练营”、“搞笑研究所”是搞笑内容投稿最多的&#xff0c;至今两个活动已经分别…

动手实践丨基于ModelAtrs使用A2C算法制作登月器着陆小游戏

摘要&#xff1a;在本案例中&#xff0c;我们将展示如何基于A2C算法&#xff0c;训练一个LunarLander小游戏。本文分享自华为云社区《使用A2C算法控制登月器着陆》&#xff0c;作者&#xff1a;HWCloudAI 。 LunarLander是一款控制类的小游戏&#xff0c;也是强化学习中常用的…

C# dll代码混淆加密

目录 一、需求 二、用法 1.新建C#项目 2.开始加密 3.常见的错误 4.添加加密规则 5.导出加密dll 6.调用加密dll 结束 一、需求 C# 项目生成 dll&#xff0c;在反编译工具下&#xff0c;好比皇帝的新装&#xff0c;dll 内部的代码看的一清二楚&#xff0c;在这里推荐一…

关于Cy5.5 alkyne,Cyanine7 alkyne和1628790-37-3,1998119-13-3两者的区别

外观以及性质&#xff1a; Cy5.5 alkyne和Cy7alkyne 都含有荧光基团&#xff0c;其中氰基7的炔烃衍生物&#xff0c;近红外荧光团&#xff0c;Cy7的类似物&#xff0c;Cyanine5.5 alkyne用于点击化学标记的远红外/近红外染料炔烃&#xff0c;炔烃可以通过铜催化的点击化学与多种…

Ubuntu 22.04 一次及其繁琐的 允许 Traceroute 探测漏洞修复之旅

前言&#xff1a;允许 Traceroute 探测是绿盟漏洞扫描器报出来的一个漏洞&#xff0c;如下图&#xff1a; 我的系统是ubuntu 22.04&#xff0c;但由于是用户提供的虚拟机&#xff0c;会有些定制的部分&#xff0c;具体定制了哪部分就不知道了&#xff0c;直接描述问题。 解决问…

【服务器数据恢复】LINUX误删除、误格式化的数据恢复

Linux误删除及误格式化的数据恢复方案针对的文件系统&#xff1a; 1 、基于EXT2/EXT3/EXT4文件系统 &#xff1b; 2 、基于Reiserfs文件系统&#xff1b; 3 、基于Xfs文件系统。 Linux误删除及误格式化的数据恢复解决方案&#xff1a; 一、故障检测&#xff1a; 1、检测是否存在…

java学习day56(Spring Boot)Spring Boot

主要内容&#xff1a; 1.Spring Boot基本应用 2.Spring Boot原理深入及源码剖析 3.Spring Boot数据访问 4.Spring Boot视图技术 5.Spring Boot实战演练 6.Spring Boot项目部署 1. SpringBoot基本应用 1.1 约定优于配置Build Anything with Spring Boot&#xff1a;Spring Boot …

【数据结构】堆的实现及排序

目录一、树的相关概念及其特殊二叉树1、数的相关概念2、特殊二叉树二、堆1、堆的实现1.1、堆向下调整算法和向上调整算法的时间复杂度1.2、堆的构建1.3、堆的插入1.4、堆的删除1.5、取堆顶的数据、堆的个数及堆的判空2、堆的排序一、树的相关概念及其特殊二叉树 讲堆之前&#…

透视虎牙斗鱼三季报:游戏直播在各自“求变”中见分晓

游戏直播行业&#xff0c;依然硝烟弥漫。 经历千播大战、熊猫出局的洗礼后&#xff0c;虎牙和斗鱼双方缠斗升级&#xff0c;另有B站和抖音、快手等视频平台来势汹汹&#xff0c;抢夺仅有的市场蛋糕。 而在游戏行业遇冷、政策趋严等因素多重考验下&#xff0c;这场争夺战无疑将…

fsync

由于目前操作系统都具有延迟写(delayed write)功能&#xff0c; fwrite/write并不会直接把数据写到磁盘上&#xff0c; 而是在buffer满时才开始写入到磁盘。 要想把数据写到磁盘上&#xff0c;需要调用fsync函数 open(fd) write(fd) fsync(fd) close(fd) 或者 fopen(fp…

金仓数据库KingbaseES查询计划剖析

目录 1、KingbaseES数据库中的查询生命周期 2、数据设置 3、KingbaseES解释一个查询 4、什么是数据库中的缓冲区和缓存&#xff1f; 5、VERBOSE 命令参数 6、KingbaseES中的 FORMAT 解释 7、总结EXPLAIN使用方式 8、执行计划查看 了解KingbaseES查询计划对于开发人员和…