undefined reference



  • 编译求解器的时候出现undedined reference错误。

    /usr/bin/ld: /home/dyfluid/OpenFOAM/OpenFOAM-v2006/build/linux64GccDPInt32Opt/applications/solvers/multiphase/twoPhaseChangePorousFoam/twoPhaseChangePorousFoam.o: in function `main':
    twoPhaseChangePorousFoam.C:(.text.startup+0x2b63): undefined reference to `Foam::porousInterfaceProperties::porousInterfaceProperties(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh> const&, Foam::IOdictionary const&)'
    /usr/bin/ld: twoPhaseChangePorousFoam.C:(.text.startup+0x89c5): undefined reference to `Foam::porousInterfaceProperties::porousInterfaceProperties(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh> const&, Foam::IOdictionary const&)'
    /usr/bin/ld: twoPhaseChangePorousFoam.C:(.text.startup+0x11e20): undefined reference to `Foam::porousInterfaceProperties::correct()'
    /usr/bin/ld: twoPhaseChangePorousFoam.C:(.text.startup+0x19e45): undefined reference to `Foam::porousInterfaceProperties::nearInterface() const'
    collect2: error: ld returned 1 exit status
    make: *** [/home/dyfluid/OpenFOAM/OpenFOAM-v2006/wmake/makefiles/general:150: /home/dyfluid/OpenFOAM/dyfluid-v2006/platforms/linux64GccDPInt32Opt/bin/twoPhaseChangePorousFoam] Error 1
    

    根据网上已有的错误来源进行了排查。

    porousInterfaceProperties
    (
                const volScalarField& alpha1,
                const volVectorField& U,
                const IOdictionary&
    );
    //- Destructor
    virtual ~porousInterfaceProperties() = default;
    

    在createFields.H中定义如下,参数的类型是一致的。

    porousInterfaceProperties interface
    (
        alpha1,
        U,
        transportProperties
    );
    


  • @hongjiewang 已解决~不过我是把所有的库都编译在了FOAM_LIBBIN和FOAM_APPBIN下,所以应该是我的编译路径有问题~



  • 上面的办法并不可行~会出现Duplicate entry constantAlphaContactAngle in runtime selection table fvPatchField 等类似的错误。还是应该放在USER下



  • 已经编译成功。错误的原因是,有其他的求解器中有相同的库,把其他的求解器编译的删除掉(因为那些求解器只是过渡 所以就选择删除了)或者命名为不同的库 可以减少这类错误的发生。这也是为啥放在of源代码的位置上就没有所述错误的原因。
    不过编译结束之后,会出现Duplicate entry错误,还没有解决这个问题,希望能得到各位老师的指导。谢谢~
    1610451995(1).png


  • 版主 副教授

    这重的也太猛了……重了五个,如果说解决问题是开锁,这个锁眼都快堵死了:143:

    这是长期乱套导致的,越往后越纠缠不清。这问题太细致,一个操作都能写出来几个分叉,操作多了就说不全了。

    好习惯建议:

    https://cfd-china.com/topic/3190/分享一个在任意文件夹中编译库或求解器的办法

    这个里面我也跟了个帖子,是写在.bashrc里的,现在又改良了,就是下面这个代码,单独成一个文件,在openfoam里的etc/bashrc里加载。可以把代码和算例分开放,备份方便(被屏蔽的前三行)。还增加了openfoam里没有的快捷命令,可以把用户的东西(代码、二进制、算例)与自带的完全分开。

    #\$export FOAM_INST_DIR=\$HOME/.local/share/\$WM_PROJECT
    
    #export WM_PROJECT_USER_DIR=\$HOME/Documents/openfoam/\$USER-\$WM_PROJECT_VERSION
    #export WM_PROJECT_USER_CODE_DIR=\$HOME/Documents/code/C/openfoam/\$USER-\$WM_PROJECT_VERSION
    
    #-------------------------------------------------------------------------------
    export FOAM_USER_SRC=\$WM_PROJECT_USER_CODE_DIR/src;
    #-------------------------------------------------------------------------------
    export FOAM_USER_APP=\$WM_PROJECT_USER_CODE_DIR/applications;
    export FOAM_USER_SOLVERS=\$WM_PROJECT_USER_CODE_DIR/applications/solvers;
    export FOAM_USER_UTILITIES=\$WM_PROJECT_USER_CODE_DIR/applications/utilities;
    #-------------------------------------------------------------------------------
    export FOAM_USER_TUTORIALS=\$WM_PROJECT_USER_DIR/run/tutorials
    
    
    alias msrc='cd \$FOAM_USER_SRC'
    #-------------------------------------------------------------------------------
    alias mapp='cd \$FOAM_USER_APP'
    alias msol='cd \$FOAM_USER_SOLVERS'
    alias mutil='cd \$FOAM_USER_UTILITIES'
    #-------------------------------------------------------------------------------
    alias mtut='cd \$FOAM_USER_TUTORIALS'
    
    
    alias mappb='cd \$FOAM_USER_APPBIN'
    alias mlibb='cd \$FOAM_USER_LIBBIN'
    
    

    加载上面的代码的位置放在下面这个地方,我是连安装位置一起修改了,所以看起来比较乱(只看第三行,前两行是另一个修改,可以定位)。上面的代码我放在my_enviroment文件夹里,每个版本都有各自的,大体相同,不同处可以分开修改

    -export WM_PROJECT_USER_DIR=\$HOME/\$WM_PROJECT/\$USER-\$WM_PROJECT_VERSION
    +export WM_PROJECT_USER_DIR=\$HOME/.local/share/\$WM_PROJECT/\$USER-\$WM_PROJECT_VERSION
    +source \$FOAM_INST_DIR/my_environment/\$USER-$WM_PROJECT_VERSION
    

    openfoam自带的快捷命令在etc/config.sh/alisas,自定义的环境变量在etc/config.sh/setting。但是并不是每个环境变量都有带user版本的,快捷命令更没有。

    最好是不要有重名的库,不重名,其实放不放user都行,但是分开放更好。无论是备份自己的工作还是不弄乱原有的代码。

    还有一个好处就是,解决这种重复。即使库名字不冲突,但库内容冲突。比如不同的库中重复定义了同一个类。这时候把编译时要链接的库地址删了带冲突库的路径,这样就不冲突,甚至会缺。缺的单独拉到user里就行。



  • @bestucan 终于解决啦 谢谢老师 感谢分享~:ok3:


Log in to reply
 


CFD中文网 | 东岳流体学术 | 东岳流体商业 | 吉ICP备20003622号-1