【问题标题】:How to tell c++ linker that some classes will be added later by dlopen如何告诉 c++ 链接器某些类稍后将由 dlopen 添加
【发布时间】:2018-03-22 16:54:51
【问题描述】:

我正在尝试重新设计遗留的 C++ 代码。

我想从项目中取出部分代码作为“.so”共享库,并通过“dlopen”动态加载它们。

我写了一个动态加载机制,可以在运行时动态加载新模块。

现在我想将现有模块与主项目分离。

例如,我从主项目中提取了模块“X”并创建了可以稍后加载的共享库,但主项目的某些部分直接使用模块 X 的类,我还不能更改它们。

我可以使用模块 X 的头文件编译项目,但链接器抛出“未定义引用”错误。

如何告诉 c++ 链接器这些类稍后会在运行时通过 dlopen 机制添加?

注意:我可以通过在“/lib”文件夹中复制创建的模块 X 的“.so”文件来链接和运行项目,并在通过“-lX”标志链接时使用它,但如果我从 /lib 中删除此文件项目启动时失败的文件夹。

【问题讨论】:

    标签: g++ shared-libraries dlopen


    【解决方案1】:

    我知道如果您直接使用 X 的类,您必须将 X.so 链接到您的程序。但是如果你链接 X.so 你可以在运行时使用 dlopen 。

    【讨论】:

    • 是的,但我想删除链接时间依赖性。我将 X 类更改为调用解耦模块函数的代理类。
    【解决方案2】:

    您需要的是一个导入库。它们包含所有必要功能的小型包装器,因此满足所有静态链接器依赖项。在运行时,如果动态库尚未加载,这些包装器将加载动态库并将执行转发到库内的实际实现。

    导入库是 Windows DLL 的标准功能,但它们在 Linux(或任何 POSIX 系统)上不可用。您可以手动实现包装器或使用Implib.so 自动生成它们。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 2017-01-22
      • 2013-05-02
      • 2012-03-25
      • 2012-06-22
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多