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
根据网上已有的错误来源进行了排查。
-
https://cfd-china.com/topic/926/未定义的引用-undefined-reference?_=1610429640554
我的下面显示的错误函数并不是虚函数,在.C文件中有对member function进行定义。 -
https://cfd-china.com/topic/3699/编译求解器出现-undefined-reference/2?_=1610429640557
cd $FOAM_USER_LIBBIN可以看到libporousInterfaceProperties.so文件,确实是在编译库中。接下来检查定义问题。
在porousInterfaceProperties.H中声明
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错误,还没有解决这个问题,希望能得到各位老师的指导。谢谢~
-
这重的也太猛了……重了五个,如果说解决问题是开锁,这个锁眼都快堵死了
这是长期乱套导致的,越往后越纠缠不清。这问题太细致,一个操作都能写出来几个分叉,操作多了就说不全了。
好习惯建议:
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里就行。