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