我正在尝试将同一个应用程序链接到同一个库的两个不同版本。让我们调用库 libOld 和 libNew 。 libNew有一个新方法(让我们称之为 newMethod()),libOld没有。
当我的应用程序试图调用不在libOld中的newMethod()时,链接器显然会失败。是否有可能以某种方式解决这个问题,以便我可以链接到newMethod()只有它可用?也就是说,如果应用程序与libNew而不是libOld链接。
我试图链接的库是用c ++构建的,我不能延迟或动态加载它,因为它包含导出的静态数据对象,并且它不包含用于构造c ++对象的任何外部“C”工厂类,这可能有助于与内存管理。
工具链更新
该应用程序是在Windows上为Windows CE 5.0构建的,在ARM处理器上运行(如果这很重要)。我试图使用的库是封闭源代码。该应用程序使用qt框架。
答案 0 :(得分:2)
通常的解决方案是在您的可执行文件中添加弱符号newMethod()
。由于libNew提供了强符号newMethod
,因此会覆盖弱符号。当您与lidOld
链接时,弱符号是唯一的符号并将被使用。
弱符号很常见但不是标准符号。检查编译器工具链。
答案 1 :(得分:1)
你的问题,如果我理解正确的话,不是你能以优雅的方式解决的问题,因为这不是一个问题,而是意味着"要直接解决。你是"意思是"构建针对特定库版本的应用程序(如果它们特别是二进制兼容,它可能会对其他版本起作用,但这很少见,因为它需要额外的设计和测试工作)。
因此,如果您需要支持多个冲突的库版本,则需要提供多个版本的应用程序二进制文件。就这么简单。
如果您需要提供单个应用程序安装程序包,则可以创建一个单独的启动程序应用程序,以某种方式检测应该执行哪个实际应用程序二进制文件(这可能只是一个.BAT / shell脚本)。检测可以像尝试启动一个二进制一样简单,如果它失败并带有特定的错误代码(由DLL加载问题引起),那么你启动另一个二进制文件。
答案 2 :(得分:0)
人们会期望图书馆提供一些获取版本的机制......问题是如何完成。
如果它是带有版本号的#define,那么你可以使用#if包围你的newMethod()。
如果您有返回版本的功能,或者您的版本根本不可用,现在是介绍它们的好时机,但您必须添加#ifdef才能支持。