Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 编译自己的求解器遇到问题“undefined reference”

编译自己的求解器遇到问题“undefined reference”

已定时 已固定 已锁定 已移动 OpenFOAM
25 帖子 4 发布者 18.7k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Y 离线
    Y 离线
    yfclark 神
    写于2019年12月5日 09:52 最后由 编辑
    #4

    编译过了只是说明你骗过了编译器不代表程序没有问题,你说的可以直接添加源项解决,通过访问mesh的cells或者face解决

    H 1 条回复 最后回复 2019年12月5日 10:13
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 10:13 中回复了 yfclark 最后由 编辑
    #5

    @yfclark 在 编译自己的求解器遇到问题“undefined reference” 中说:

    编译过了只是说明你骗过了编译器不代表程序没有问题,你说的可以直接添加源项解决,通过访问mesh的cells或者face解决

    那个netpanel的class的作用就是找到特定的mesh,并在cells决添加源项。

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yfclark 神
    写于2019年12月5日 10:28 最后由 李东岳 编辑 2019年12月5日 20:59
    #6

    试一下

    //create volfield as source term
    //initial it as zero
    //forAll(mesh,celli)
    {
            if condition  
       S[celli]=your value
    }
    

    自己琢磨一下

    H 1 条回复 最后回复 2019年12月5日 10:56
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 10:56 中回复了 yfclark 最后由 编辑
    #7

    @yfclark
    这个function, 我已经写到我的class中了,但是问题是在编译求解器时遇到问题“undefined reference”

    void Foam::netPanel::addResistance
    (
    fvVectorMatrix& UEqn,
    const volScalarField& nu,
    const fvMesh& mesh_,
    const volVectorField& structuralPositions,
    const volVectorField& structuralElements
    )
    {
    const vectorField& centres(mesh_.C());
    forAll(structuralElements,Elementi)
    {
    dimensionedTensor d_(tensor::zero);
    dimensionedTensor f_(tensor::zero);
    transformCoeffs(D_,d_,structuralPositions,structuralElements[Elementi]);
    transformCoeffs(F_,f_,structuralPositions,structuralElements[Elementi]);
    tensor& dvalue = d_.value();
    tensor& fvalue = f_.value();
    const scalarField V = mesh_.V();
    vectorField& Usource = UEqn.source();
    const vectorField& U = UEqn.psi();
    forAll(centres, cellI)
    {
    if(isInPorousZone(centres[cellI],structuralPositions,structuralElements[Elementi]))
    {
    tensor dragCoeff = nu[cellI]*dvalue + 0.5*mag(U[cellI])*fvalue;
    Usource[cellI] -=V[cellI]*dragCoeff & (U[cellI] );
    }
    }
    }
    }
    1 条回复 最后回复
  • Y 离线
    Y 离线
    yfclark 神
    写于2019年12月5日 11:09 最后由 编辑
    #8

    老哥,你这么老实,你直接函数式编程不就行了嘛,非要写class

    1 条回复 最后回复
  • H 离线
    H 离线
    huiCfd
    写于2019年12月5日 11:43 最后由 编辑
    #9

    我在想是不是 我的这个option里买有格式错误。
    我试过将

    EXE_LIBS = \
        -L$(FOAM_USER_LIBBIN)\ -lnetPanel \
    

    改为

    EXE_LIBS = \
        -L$(FOAM_USER_LIBBIN) -lnetPanel \
    

    结果感觉更错啦

         -lm -o /home/hui/OpenFOAM/hui-v1906/platforms/linux64GccDPInt32Opt/bin/dynaPorousNetFoam
    /usr/bin/ld: cannot find -lnetPanel
    collect2: error: ld returned 1 exit status
    /opt/OpenFOAM/OpenFOAM-v1906/wmake/makefiles/general:140: recipe for target '/home/hui/OpenFOAM/hui-v1906/platforms/linux64GccDPInt32Opt/bin/dynaPorousNetFoam' failed
    make: *** [/home/hui/OpenFOAM/hui-v1906/platforms/linux64GccDPInt32Opt/bin/dynaPorousNetFoam] Error 1
    
    
    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2019年12月5日 13:01 最后由 编辑
    #10

    undefined reference可能出现在你的虚函数,具体什么问题不太清楚,检查下你的成员函数

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    H 1 条回复 最后回复 2019年12月5日 13:47
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 13:47 中回复了 李东岳 最后由 编辑
    #11

    @东岳 感谢东岳老师回复,我又看了一下错误提示,出现问题的都是我写的虚函数。

    W 1 条回复 最后回复 2019年12月5日 14:17
  • W 离线
    W 离线
    wwzhao 超神
    在 2019年12月5日 14:17 中回复了 huiCfd 最后由 编辑
    #12

    @huiCfd 构造函数和析构函数是不是忘记定义了?

    H 1 条回复 最后回复 2019年12月5日 14:39
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 14:39 中回复了 wwzhao 最后由 编辑
    #13

    @wwzhao 赵教授,这两个函数我记得定义了,

        // Constructors
           netPanel
           (
               const dictionary&        netDict
           );
    
        //- Destructor
        ~netPanel();
    

    但是我有一点不太明白,为什么有的函数后面有一个const,有的没有。例如:
    这个虚函数是void funname() const;

    void addResistance
    (
    fvVectorMatrix& UEqn,
    const volScalarField& nu,
    const fvMesh& mesh,
    const matrix& structuralPositions,
    const matrix& structuralElements
    )const;

    而这个函数是 bool funname(); 就没有const了。

    bool isInPorousZone
    (
    const point x,
    const volVectorField& structuralPositions,
    const vector& structuralElementi
    );

    const 在括号里面我知道是可以保证传入的参数不变,但是在外边是啥意思啊?

    H W 2 条回复 最后回复 2019年12月5日 14:43
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 14:43 中回复了 huiCfd 最后由 编辑
    #14

    @huiCfd
    这个函数后面的const 是用来保护类的成员数据不发生改变。

    1 条回复 最后回复
  • W 离线
    W 离线
    wwzhao 超神
    在 2019年12月5日 14:45 中回复了 huiCfd 最后由 编辑
    #15

    @huiCfd 你这个只是声明(declaration),有没有具体的定义(definition)?

    H 1 条回复 最后回复 2019年12月5日 14:51
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 14:51 中回复了 wwzhao 最后由 编辑
    #16

    @wwzhao
    定义也是有的。如下

    Foam::netPanel::netPanel
    (
        const dictionary&        netDict
    )
    :   // initial components
        netDict_(netDict),
        porousPropertiesDict_(netDict_.subDict("porousProperties")),
        porosity_(readScalar(porousPropertiesDict_.lookup("porosity"))),
        thickness_(readScalar(porousPropertiesDict_.lookup("halfthickness")))
        // D_(readVector(porousPropertiesDict_.lookup("D"))),  // initial as zeros
        // F_(readVector(porousPropertiesDict_.lookup("D")))  // initial as zeros
    {
        dimensionedVector D_(porousPropertiesDict_.lookup("D"));
        dimensionedVector F_(porousPropertiesDict_.lookup("F"));
    
    }
    
    W 1 条回复 最后回复 2019年12月5日 15:09
  • W 离线
    W 离线
    wwzhao 超神
    在 2019年12月5日 15:09 中回复了 huiCfd 最后由 编辑
    #17

    @huiCfd 把 netPanel.so 重命名成 libnetPanel.so 试试呢?

    H 1 条回复 最后回复 2019年12月5日 15:17
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 15:17 中回复了 wwzhao 最后由 编辑
    #18

    @wwzhao 不行。。

    W 1 条回复 最后回复 2019年12月5日 15:24
  • W 离线
    W 离线
    wwzhao 超神
    在 2019年12月5日 15:24 中回复了 huiCfd 最后由 编辑
    #19

    @huiCfd $(FOAM_USER_LIBBIN) 后面的换行符去掉了吗?

    H 1 条回复 最后回复 2019年12月5日 15:37
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 15:37 中回复了 wwzhao 最后由 编辑
    #20

    @wwzhao 是的,去掉何不去掉都试过了,
    去掉后显示的错误是

     -lm -o /home/hui/OpenFOAM/hui-v1906/platforms/linux64GccDPInt32Opt/bin/dynaPorousNetFoam
    /usr/bin/ld: cannot find -llibnetPanel
    collect2: error: ld returned 1 exit status
    /opt/OpenFOAM/OpenFOAM-v1906/wmake/makefiles/general:140: recipe for target '/home/hui/OpenFOAM/hui-v1906/platforms/linux64GccDPInt32Opt/bin/dynaPorousNetFoam' failed
    make: *** [/home/hui/OpenFOAM/hui-v1906/platforms/linux64GccDPInt32Opt/bin/dynaPorousNetFoam] Error 1
    

    没去掉的话跟原来的错误一样,都是undefined reference

    W 1 条回复 最后回复 2019年12月5日 15:40
  • W 离线
    W 离线
    wwzhao 超神
    在 2019年12月5日 15:40 中回复了 huiCfd 最后由 编辑
    #21

    @huiCfd
    1、去掉$(FOAM_USER_LIBBIN)后的换行符,注意后面的 netPanel 前不要加lib

    EXE_LIBS = \
        -L$(FOAM_USER_LIBBIN) -lnetPanel \
    

    2、编译出来的 netPanel.so 文件重命名为 libnetPanel.so

    H 1 条回复 最后回复 2019年12月5日 15:49
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 15:49 中回复了 wwzhao 最后由 编辑
    #22

    @wwzhao
    成功了啊! 非常感谢。。
    是不可以总结如下经验:

    1. 自己编写的类在编译时一定要以lib开头,
    2. 然后在编译主程序时,$(FOAM_USER_LIBBIN)后面不能有换行符,
    3. -l之后直接跟自己编译的东西但是要去掉lib
    H 1 条回复 最后回复 2019年12月5日 15:52
  • H 离线
    H 离线
    huiCfd
    在 2019年12月5日 15:52 中回复了 huiCfd 最后由 编辑
    #23

    @huiCfd 可能这个适用于of1906

    1 条回复 最后回复
2019年12月4日 22:16

13/25

2019年12月5日 14:39

未读 12
2019年12月6日 07:37
  • 登录

  • 登录或注册以进行搜索。
13 / 25
  • 第一个帖子
    13/25
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]