CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    运行时动态加载库

    OpenFOAM
    5
    8
    1507
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 马乔
      马乔 副教授 最后由 编辑

      在一个solver或者util运行时,会自动加载链接器链接到它身上的库,但想在运行时动态地通过字典文件灵活加载动态库该怎么办呢?可以通过这样的操作:

      const_cast<Time&>(io.time()).libs().open
      (
          dict,
          "dynamicFvMeshLibs",
          IOobjectConstructorTablePtr_
      );
      

      操作会加载dict中dynamicFvMeshLibs声明的库,并通过与IOobjectConstructorTablePtr_ 这个列表对比是否为已经加载过的类。跳转到libs()函数返回的dlLibraryTable对象的open函数

      template<class TablePtr>
       bool Foam::dlLibraryTable::open
       (
           const dictionary& dict,
           const word& libsEntry,
           const TablePtr& tablePtr
       )
       {
           fileNameList libNames;
           dict.readIfPresent(libsEntry, libNames);
        
           label nOpen = 0;
        
           for (const fileName& libName : libNames)
           {
               const label nEntries = (tablePtr ? tablePtr->size() : 0);
        
               if (dlLibraryTable::open(libName))
               {
                   ++nOpen;
        
                   if (debug && (!tablePtr || tablePtr->size() <= nEntries))
                   {
                       WarningInFunction
                           << "library " << libName
                           << " did not introduce any new entries"
                           << nl << endl;
                   }
               }
               ...
      

      注意传入的tablePtr是const& ,意味着在函数体内不能修改。
      dict.readIfPresent(libsEntry, libNames);通过libsEntry读取一系列动态库名,并在for循环中遍历,并通过open函数真正加载动态库。需要注意的是nEntries在open函数前等于tablePtr->size(),而在之后又与tablePtr->size() <= nEntries进行对比,只能说明tablePtr在open中被修改了,但tablePtr的是const的呀!很好理解,传入的IOobjectConstructorTablePtr_是全局静态变量,在函数体外修改是没得关系的。具体就是在open动态库的时候addToRunTimeSelectionTable(dynamicFvMesh, dynamicRefineFvMesh, IOobject);这一句被调用,它会把自己的typeName插入到IOobjectConstructorTablePtr_,从而更新此列表。

      装逼没输过,吵架没赢过!

      Micro 1 条回复 最后回复 回复 引用
      • 李东岳
        李东岳 管理员 最后由 编辑

        不明觉厉:xinxin2: :xinxin2: :xinxin2: :xinxin2:

        2023年线下CFD课 报名正式启动 http://dyfluid.com/class.html
        CFD高性能服务器 http://dyfluid.com/servers.html

        1 条回复 最后回复 回复 引用
        • Micro
          Micro 最后由 编辑

          真厉害!之前一直没有见过深入讲解“运行时动态加载库”的文章,我按照你说的好好看一下。

          1 条回复 最后回复 回复 引用
          • Micro
            Micro 最后由 编辑

            对了老师,这种运行时加载动态库的操作 是不是 这里的动态库不能是任意的动态库,而必须是继承已有基类的子类编写而成的动态库。就比如,基类是solver,子类是一系列具体迭代方法;基类是边界条件,子类是一系列具体边条。总是这些子类形成的动态库所提供的方法都是在字典文件中以关键字可选项的形式出现的。我的问题是:如果我们用户自定义一种完全脱离OF中基类的独立的动态库,那么此时要想调用该库,是不是必须编译上层应用再链接该库,而不是像您这篇帖子中所说的通过在congtrolDict中添加libs的形式来动态调用该库呢?谢谢!

            1 条回复 最后回复 回复 引用
            • Micro
              Micro @马乔 最后由 编辑

              @马乔 在 运行时动态加载库 中说:

              并通过open函数真正加载动态库

              老师,您这里提到的open函数,是c标准库中的函数吗?还是OF中的函数?我想查查这个函数具体是怎么实现库的加载的,谢谢老师!

              浪 1 条回复 最后回复 回复 引用
              • 浪
                浪迹天大 @Micro 最后由 编辑

                @Micro 我有个朋友写过相关的博文,感兴趣可以看看
                https://zmeng.tech/2020/10/DynamicLibraries/

                OpenFOAM 学习交流:https://openfoam.top

                Micro 新 2 条回复 最后回复 回复 引用
                • Micro
                  Micro @浪迹天大 最后由 编辑

                  @浪迹天大 好的,非常感谢哈!我好好看一看

                  1 条回复 最后回复 回复 引用
                  • 新
                    新喻庸 @浪迹天大 最后由 编辑

                    @浪迹天大 在 运行时动态加载库 中说:

                    @Micro 我有个朋友写过相关的博文,感兴趣可以看看
                    https://zmeng.tech/2020/10/DynamicLibraries/

                    https://zmeng.tech/2020/10/DynamicLibraries/

                    1 条回复 最后回复 回复 引用
                    • First post
                      Last post