如何告诉c ++链接器稍后将由dlopen添加一些类

时间:2017-10-11 06:17:01

标签: c++ shared-libraries dlopen legacy-code re-engineering

我有遗留的c ++代码,我正在尝试重新设计它。

我希望将项目中的部分代码作为" .so"共享库并通过" dlopen"动态加载它们。

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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