关于"xxx.so对“XXX”未定义的引用"错误



  • 在OpenFOAM2.3中,将自定义2.1的湍流模型编译到OpenFOAM2.3 src/turbulenceModels/RAS 源库中,然后编译求解器时,会出现如下错误:

    /home/kdd/OpenFOAM/OpenFOAM-2.3.1/platforms/linux64GccDPOpt/lib/libincompressibleRASModels.so:对'Foam::incompressible::RASModels::kOmegaMHD::divDevRhoReff(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh>&) const'未定义的引用
    collect2: error: ld returned 1 exit status
    make: *** [/home/kdd/OpenFOAM/kdd-2.3.1/platforms/linux64GccDPOpt/bin/MHDRASpisoFoam] Error 1
    /home/kdd/OpenFOAM/OpenFOAM-2.3.1/wmake/Makefile:149: recipe for target '/home/kdd/OpenFOAM/kdd-2.3.1/platforms/linux64GccDPOpt/bin/MHDRASpisoFoam' failed
    

    报错原因显示无法从 libincompressibleRASModels.so库中定位到divDevRhoReff这个可压缩函数。根据这个错误找到我们自己先前在源库中自己编译进去的湍流模型kOmegaMHD发现,在H文件已经添加的divDevRhoReff 这个函数,如下:

    //- Return the source term for the momentum equation
        virtual tmp<fvVectorMatrix> divDevRhoReff
        (
            const volScalarField& rho,
            volVectorField& U
        ) const; 
    

    但是在湍流模型的kOmegaMHD的C文件中却没有关于这个函数的具体实现。就是这个原因导致虽然能够将湍流模型编译成功,但是在编译可执行文件/程序(求解器)时(我们在Options中链接了-lincompressibleRASModels动态库)报错。因为C/C++编译为obj文件的时候只要有函数的原型(H文件中的函数)即可,不需要函数的具体实现,但在链接为可执行文件的时候就必须要具体的实现(.C中与.H中函数对应的函数的具体形式)。
    所以在C文件中将divDevRhoReff函数的具体实现写进去,如下:

    tmp<fvVectorMatrix> kOmegaMHD:;divDevRhoReff
    (
     const volScalarField& rho,
       volVectorField& U
    ) const
    {
        volScalarField muEff("muEff",rho*nuEff());
    
       return
       (
        - fvm::laplacian(muEff,U)
        -fvc::div(muEff*dev(T(fvc::grad(U))))
       );
    }
    

    重新编译湍流模型,然后在编译求解器,就能成功了。还需要注意的是,当我将湍流模型只编译到自己的模型库中,编译求解器时并没有报错(因为没有连接到这个模型),只会在算例调用这个模型时显示如上错误(同时还会附带dlopen函数无法打开(和无法加载)该湍流模型。



  • 看你做这个东西好几天了 终于弄出来了 恭喜!
    感谢鸭蛋分享 楼主好人 另外我听说你师姐毕业了 @一颗李子 @一颗栗子 @一颗橙子 不知道是其中哪个



  • @东岳 东岳老师听说的很准确。不出意外的话我明年四月毕业。



  • 看你们队形这么好,我都想叫一颗东岳了 :chitang: 我还认识一个女博士,做CFD+实验的,人在国外,老公在国内,孩子刚出生,没人帮着带,自己做实验,各种不会,异国他乡,看朋友圈每天都各种悲剧,有时候孩子生病了,有时候被老外歧视了,不知道什么时候能毕业

    感觉能如期毕业,真应该好好庆祝一下。都太难了 :zoule: 恭喜你

    鸭蛋那个问题也是,程序上有时候都是特别小的细节错误,很难debug,有时候我一个 + 号写成了 - 号,就发散了,谁都不知道为什么,只能自己找找,同样恭喜鸭蛋



  • @东岳 谢谢东岳老师😄😄😄



  • 这个问题就是虚基类和虚函数。在虚基类中声明虚函数,提供了一个接口。但是在子类中要具体定义这个函数。我印象中divDevRhoReff是在linearViscousStress中具体定义的



  • @Samuel-Tu 嗯嗯


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2