Navigation

    CFD中文网

    CFD中文网

    • Login
    • Search
    • 最新

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

    OpenFOAM
    4
    7
    1209
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 一
      一颗鸭蛋 last edited by

      在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函数无法打开(和无法加载)该湍流模型。

      1 Reply Last reply Reply Quote
      • 李东岳
        李东岳 管理员 last edited by 李东岳

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

        CFD高性能服务器 http://dyfluid.com/servers.html

        一 1 Reply Last reply Reply Quote
        • 一
          一颗栗子 @李东岳 last edited by

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

          1 Reply Last reply Reply Quote
          • 李东岳
            李东岳 管理员 last edited by 李东岳

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

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

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

            CFD高性能服务器 http://dyfluid.com/servers.html

            一 1 Reply Last reply Reply Quote
            • 一
              一颗鸭蛋 @李东岳 last edited by

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

              1 Reply Last reply Reply Quote
              • S
                Samuel-Tu last edited by

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

                一 1 Reply Last reply Reply Quote
                • 一
                  一颗鸭蛋 @Samuel-Tu last edited by

                  @Samuel-Tu 嗯嗯

                  1 Reply Last reply Reply Quote
                  • First post
                    Last post

                  CFD中文网 | 东岳流体 | 京ICP备15017992号-2
                  论坛登录问题反馈可联系 li.dy@dyfluid.com