2017-10-11 81 views
0

我有一个遗留的C++代码,我正在尝试重新设计它。如何告诉C++连接器,稍后将由dlopen添加一些类

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

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

现在我想解耦来自主项目的现有模块。

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

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

我该如何告诉C++连接器这些类将在稍后由运行时的dlopen机制添加?

注:我可以通过复制模块X的创造“所以”文件‘/ lib目录’链接和运行项目文件夹和‘-Lx’标志链接时使用它,但如果我删除这个文件形成/ lib文件夹启动时项目失败。

回答

0

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

+0

是的,但我想删除链接时间依赖。我将X类更改为调用解耦模块函数的代理类。 – Emech

0

你需要什么叫做导入库。它们包含所有必要函数的小包装,因此可以满足所有静态链接器的依赖关系。在运行时,这些包装器会加载动态库,如果它尚未加载并将执行转发到库中的实际实现。

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

相关问题